JAVA IO系列---字符编码

来源:互联网 发布:伊万的童年 知乎 编辑:程序博客网 时间:2024/06/05 09:44

·字符编码:计算机里只有数字,计算机软件里的一切都是用数字来表示的,屏幕上显示的一个个字符也不例外。

·ASCII码:字符a对应数字97,字符b对应数字98等,这种字符与数字对应的编码规则被称为ASCII码。ASCII的最高bit位都是0,也就是说这些数   字都在0到127之间。

·国标码:中国大陆将每一个中文字符都用两个字节的数字来表示,中文字符的每个字节的最高bit位都是1,中国大陆为每个中文字符指定的编码  规则称为GB2312(国标码)。

·国标K码:在GB2312的基础上,对更多的中文字符(包括繁体)进行了编码,新的编码规则称为GBK。

·在中国大陆使用的计算机系统上,GBK和GB2312就被称为该系统的本地字符集。

·大五码:“中国”的”中“字在中国大陆的编码是十六进制的D6D0,而在中国台湾的编码是十六进制的A4A4,台湾地区对中文字符集的编码规则  称为BIG5(大五码)。

·在一个国家的本地化系统中出现的字符,通过电子邮件传送到另外一个国家的本地化系统中,看到的就不是原始字符了,而是另外那个国家的字   符或乱码。

 

·Unicode编码:为了解决各个国家和地区使用本地化字符集带来的影响,ISO(国际标准化组织)将全世界所有的符号进行统一编码,称之为     Unicode编码。

·“中”这个符号,在全世界的任何角落始终对应的都是一个十六进制数字4e2d。

·如果所有的计算机系统都使用Unicode编码,则字符不会在其他国家或地区发生变化,仍然能正常显示。

·Unicode编码的字符都占用两个字节的大小,对于ASCII码所表示的字符,只是简单地再ASCII码原来占用的一个字节前面,增加一个所有bits   为0的字节。

·Unicode只占用两个字节,在全世界范围内所表示的字符个数不会超过2的16次方(65536),实际上,Unicode编码中还保留了两千多个  数  值没有用于字符编码。UTF-8 每字至少 1 byte,至多 4 bytes。1 byte 字符与 US-ASCII 相符。U+0800-07ff 是 2    bytes,0800-ffff    是 3 bytes,之后的是 4 bytes,UTF-32 或称 UCS-4 ,每字都是 4 bytes,UCS-2 每字都是 2 bytes,但容纳  不了扩展平面的字符,於  是,Unicode 拨出了 d800-dfff 的位置,以两个这些字符来代表扩展平面的字符。这就叫 surrogate. 加上了这  种变通方法后,UCS-2 就改  名成了UTF-16。扩展平面的字符,所占的位置就是 2 x 2 bytes。

·在相当长的一段时期内,本地化字符编码将与Unicode编码共存。

·在java中,字符使用的是Unicode编码,java在通过Unicode来保证跨平台特性的前提下,也支持本地平台字符集。

 

·UTF-8编码

    --ASCII码字符保持原样,仍然只占用一个字节,对于其他国家的字符,UTF-8使用两个或三个字节来表示。使用UTF-8编码的文件,通常   都要用EF BB BF(仅是用来标记文件的其余部分使用UTF-8编码)作为文件开头的三个字节数据。

    --UTF-8编码若第一个字节的首位为0,则该字符占用1个字节,若第一个字节的前三位为110,则该字符占用2个字节,若第一个字节的前四位为1110,则该字符占用3个字节。字符占用多于一个字节的,后面的字节的前两位都是10。

    --UTF-8的优点:

          1.ASCII码不需变化,不出现内容为0x00的字节,比Unicode减少了与其他字符冲突的机会。

          2.便于应用程序利用每个字节的前几位来检测数据在传输过程中是否发生了错误,数据发生了丢失也不会对后续字符产生判断错误。

          3. 直接处理使用ASCII码的英文文档,不需要转换,也比Unicode编码节省空间。

   --UTF-8的缺点:某些字符需要使用3个字节,是Unicode编码长度的1.5倍,尤其是对中、日、韩文字

 

·UTF-16编码

    --UTF-16编码在Unicode基础上进行了一些细节上的扩充,增加了对Unicode编码没有包括的那些字符的表示方式。

    --UTF-16对Unicode的扩充并没有影响Unicode编码所包括的那些字符,只是增加了对Unicode编码没有包括的那些字符的表示方式,一个使用Unicode编码的字符就是UTF-16的。

   --UTF-16编码将0xD800-0xDFFF区间的数值保留出来,用于扩充的字符,每个扩充的字符站用四个字节。

   --在不同体系结构的计算机系统中,UTF-16编码的Unicode字符在内存中的字节存储顺序是不同的。

   --对于0x1234这样一个双字节数据,使用little-endian和Big-endian两种方式在内存中存储的格式不同:

 

    --如果文件以0xFE 0xFF这两个字节开头,表明文本的其余部分是Big-Endian的UTF-16编码,如果文件以0xFF 0xFE这两个字节开头,则表明文本的其余部分是Little-Endian的UTF-16编码。

   

原创粉丝点击