Unicode

ASCII字符集

ASCII字符集表示了128个字符。编码从0到127(0x7f,01111111)。例如字符A的表示法有:’A’,’\0101’,’\0x41’。
计算机使用一个字节存储表示字符的数字。可以用转义的八进制或十六进制的数字代码来表示单个字符。
常用的字符及其编码:
字符‘0’的十进制数字码是48,字符‘A’的十进制数字码是65,字符‘a’的十进制数字码是97,

Unicode字符集

Unicode 字符集是一种对字符编码的标准规范,它给地球上每个字符一个指定一个唯一编号,它只给字符作编号,指定字符对应的数字,并不负责这个字符在计算机里的编码方式。Unicode字符是怎样被编码成内存中的字节,这个话题是UTF(Unicode Transformation Formats)定义的。

UTF

UTF :Unicode Transformation Formats,统一字符集传输编码。编码的核心是定义字节怎么分组,来对应每个Unicode,这个分组也被称作编码单元。

UTF8编码

最流行的Unicode编码方案是UTF-8。但unicode编码这个称呼默认是指UTF-16编码。在UTF-8中,0-127号的字符用1个字节来表示,使用和US-ASCII相同的编码。128号及以上的字符用2个、3个或者4个字节来表示。因此UTF-8被称作可变长度编码

Unicode 的平面空间

Unicode 目前规划的总空间是17个平面(平面0至16),0x0000 至 0x10FFFF。每个平面有 65536 个码点。
平面0(「Basic Multilingual Plane」,即「BMP」)有 65536 个码点,即 0x0000 至 0xFFFF。

  • BMP 的字符是 Unicode 中最基础和最常用的一部分,以 UTF-16 编码时使用2字节,以 UTF-8 编码时使用1至3字节。
  • 超出 BMP 的字符以 UTF-16 或 UTF-8 编码都需要4字节。
  • 另外还有一个比较少用的编码形式,UTF-32,它编码任何 Unicode 字符都需要4个字节。

Unicode编码是其它一些编码之间转换的桥接编码

GB2312即信息交换用汉字编码字符集,一个汉字用两个字节表示。
GBK、GB2312等与UTF8之间转换都必须通过Unicode编码。
如果UNICODE字符由2个字节表示,则编码成UTF-8可能需要3个字节。而如果UNICODE字符由4个字节表示,则编码成UTF-8可能需要6个字节。用4个或6个字节去编码一个UNICODE字符可能很少会遇到的。Unicode字符集现在有超过10万个字符,其BMP部分也有六万多个字符;而GBK字符集只有两万一千多个字符。这样从支持unicode字符集或者unicode字符集BMP的编码方式,转化到GBK编码的时候,就会有编码落到GBK字符集以外,不能转化成GBK编码。 在java中,转换之后的字符串,这部分字符都变成了’?’。处理方法就是在字符串以GBK编码写出之前,把这些字符替换掉:str = str.replace(‘/u00A0’, ‘ ‘),彻底而保险的方法是过滤所有GBK不能表示的字符:str = str.replaceAll(“[^/u4E00-/u9FA5/u3000-/u303F/uFF00-/uFFEF/u0000-/u007F/u201c-/u201d]”, ” “);

UTF8中文编码

UTF8中文编码,每个字符可能对应2个字节或3个字节的,每一个字节的最高位都是 1。利用这个特点可以简单快速的判断UTF8字符串里是否有中文。ASCII的UTF8编码和ASCII一样只占用一个字节,最高位是0(这里不包括扩展ASCII)。

BOM

BOM:Byte Order Mark。

BOM的本意是在utf16中用来表示高低字节序列的,在UTF-16里是FF FE,UTF-16以两个字节为编码单元在字节流之前有BOM表示采用低字节序列(低字节在前面)。UTF-8以字节为编码单元,没有字节序的问题,所以有无BOM都可以。

在utf-8文件中常用BOM来表明这个文件是UTF-8文件,在UTF-8里是BOM是EF BB BF。这个标记是可选的,它被用来检测一个字节流是不是UTF-8编码的。微软做这种检测,但有些软件不做这种检测,而把它当作正常字符处理。
微软在自己的UTF-8格式的文本文件之前加上了EF BB BF三个字节, windows上面的notepad等程序就是根据这三个字节来确定一个文本文件是ASCII的还是UTF-8的, 然而这个只是微软暗自作的标记, 其它平台上并没有对UTF-8文本文件做个这样的标记。

一个UTF-8文件可能有BOM,也可能没有BOM,有三种方法区分:

  • 用UltraEdit-32打开文件,切换到十六进制编辑模式,察看文件头部是否有EF BB BF。
  • 用Dreamweaver打开,察看页面属性,看“包括Unicode签名BOM”前面是否有个勾。
  • 用Windows的记事本打开,选择 “另存为”,看文件的默认编码是UTF-8还是ANSI,如果是ANSI则不带BOM。

 

快速判断UTF8字符串中是否有中文(C编程实现)
http://snailwarrior.blog.51cto.com/680306/153860
对UTF8编码方式字数做统计的函数
http://blog.csdn.net/chrisniu1984/article/details/7359908
http://msdn.microsoft.com/zh-cn/goglobal/bb688113.aspx
汉字和其gbk,unicode编码互查,查汉字时输入gbk编码的10进制数。
http://www.mytju.com/classcode/tools/encode_gb2312.asp
查询汉字的uncode,utf-8,gb2312的编码,但不能查询空格
http://www.2fz1.com/so/
3753个常用汉字的UTF-8编码大全
http://www.cr173.com/html/11686_all.html
也可以尝试用这个站查询,也不能查空格
http://www.fileformat.info/info/unicode/char/3000/index.htm

字节序

大端:数字的高位在内存的低地址。低地址在左,数组索引为0。

bit顺序

把byte转为bit数组表示其二进制时,数组索引0表示的是左边最高位。

BCD编码

BCD码(Binary-Coded Decimal‎),亦称二进码十进数或二-十进制代码。用4位二进制数来表示1位十进制数中的0~9这10个数码。是一种二进制的数字编码形式,用二进制编码的十进制代码。BCD码这种编码形式利用了四个位元来储存一个十进制的数码,使二进制和十进制之间的转换得以快捷的进行。这种编码技巧最常用于会计系统的设计里,因为会计制度经常需要对很长的数字串作准确的计算。相对于一般的浮点式记数法,采用BCD码,既可保存数值的精确度,又可免去使电脑作浮点运算时所耗费的时间。此外,对于其他需要高精确度的计算,BCD编码亦很常用。8421BCD码是最基本和最常用的BCD码,它和四位自然二进制码相似,各位的权值为8、4、2、1,故称为有权BCD码。

负数的二进制编码

负数的绝对值即正数的二进制表示每位取反,再加1。或者用2的位数次方,加上这个负数。
Java中的byte取值范围是-128到127,其中0到127的十六进制为0x00到0x7F。java中的常量数字本身是自然数,即无符号,所以表示负数时要加负号,-128表示为-0xA0,-1表示为-0x01。

例如:对0x90=144=10010000,求其负数。
方法一:256-144=112,加上负号 -112。
方法二:取反得01101111,加1得01110000,等于0x70 等于112,加上负号 -112。
方法三:144-127=17,-128+17-1=-112,即从127开始依次数,-128、-127、-126… ,数17个数,结果数到-112。

发表评论