- 计算机只有数字,计算机软件里的一切都是用数字来表示的,屏幕上显示的一个个字符也不例外。
- 字符a对应数字97,字符b对应数字98等,这种字符与数字对应的编码规则被称为ASCII(美国标准信息交换码)。ASCII的最高bit位都为0,也就是说这些数字都在0到127之间。
- 中国大陆将每一个中文字符都用两个字节的数字来表示,中文字符的每个字节的最高位都为1,中国大陆为每个中文字符制定的编码规则称为GB2312(国标码)。
- 在GB2312的基础上,对更多的中文字符(包括繁体)进行了编码,新的编码规则称为GBK。
- 在中国大陆使用的计算机系统上,GBK和GB2312就被称为该系统的本地字符集。
- “中国”的“中”字,在中国大陆的编码是十六进制的D6DO,而在中国台湾的编码是十六进制的A4A4,台湾地区对中文字符集的编码规则称为BIG5(大五码)。
- 在一个国家的本地化系统中出现的一个字符,通过电子邮件传送到另外一个国家的本地化系统中,看到的就不是那个字符了,而是另个那个国家的一个字符或乱码。
Unicode编码(是一种全球通用的字符编码)
- ISO(国际标准化组织)将全世界所有的符号进行了统一编码,称之为Unicode编码。
- “中”这个符号,在全世界的任何角落始终对应的都是一个十六进制的数字4E2D。
- 如果所用的计算机系统都使用Unicode编码,在中国大陆的本地化系统中显示的“中”这个符号,发送到伊拉克的本地化系统中,显示的仍然是“中“这个符号。
- Unicode编码的字符都占用两个字节的大小,对于ASCII码所表示的字符,只是简单地在ASCII码原来占用的一个字节前面,增加一个所有bit为0的字节。
- Unicode只占用两个字节,在全世界范围内所表示的字符个数不会超过2的16次方(65536),实际上,Unicode编码中还保留了两千多个数值没有用于字符编码。
- 在相当长的一段时期内,本地化字符编码将与Unicode编码共存。
- Java中的字符使用的都是Unicode编码,Java在通过Unicode保证跨平台特性的前提下,也支持本地平台字符集。
UTF-8编码
ASCII码字符保持原样,仍然只占用一个字节,对于其它国家的字符,UTF-8使用两个或三个字节来表示。使用UTF-8编码的文件,通常都要用EF BB BF作为文件开头的三个字节数据。
字符的UTF-8编码与Unicode编码之间的转换关系对应下列规则:
- \u0001和\u007f之间的字符,UTF-8编码为:(byte)c.
- \u0000或其范围在\u0080和\u07ff之间的字符,UTF-8编码为:
(byte)(0xc0|(0x1f&(c>>6))),(byte)(0x80|(0x3f&c)).
- \u0800和\uffff之间的字符,UTF-8编码为:
(byte)(0xe0|0x0f&(c>>12)))),(byte)(0x80|(0x3f&(c>>6))),(byte)(0x80|(0x3f&c))
从上图可以看出,应用程序软件很容易根据UTF-8编码中那些固定不变的比特值来确定一个字符占用的是一个字节呢,还是两个或是三个字节的,如果一个字节的第一个比特位为“0”,那么说明这个字符只占用一个字节;如果一个字节的前三个比特为“110”,这说明这个字符占用两个字节;如果一个字节的前四个比特为“1110”,这说明这个字符占用三个字节。对于需要二个或三个字节表示的UTF-8字符,它们的第二个和第三个字节的前两个比特位总是“10”。这样很容易与UTF-8中只占用一个字节的字符相区分,非常便于应用程序检测数据在传输过程中是不是发生了错误。
相对Unicode编码,UTF-8有一些显著的优点:
UTF-8的缺点:
- 其中有些字符需要使用三个字节,是Unicode编码的1.5倍,由其是对中日韩字符如此
使用UTF-8编码的文件,通常都要用EF BB BF作为文件开头的三个字节数据。
UTF-16编码(两个字节或四个字节)
- UTF-16编码在Unicode基础上进行了一些细节上的扩充,增加了对Unicode编码没有包括的那些字符的表示方式。
- UTF-16对Unicode的扩充并没有影响Unicode编码所包括的那些字符,只是增加了对Unicode编码没有包括的那些字符的表示方式,一个使用Unicode编码的字符就是UTF-16格式的。
- Unicode编码将OXD800-0XDFFF区间的数值保留出来,UTF-16扩充的字符,占用四个字节,前面两个字节的数值为OXD800-OXD8FF之间,后面两个字符的数值为OXDC00-OXDFFF之间。
- 为什么不让前面和后面的两个字节的数值都位于0XD800-OXDFFF之间呢?方便用于判断字符的边界。
- 在不同体系结构的计算机系统中,UTF-16编码的Unicode字符在内存中的字节存储顺序不同。
- 对于0X1234这样的一个双字节数据,使用Little-Endian和Big-Endian两种方式在内存中存储的格式,如图所示:
- 如果文件以OXFF OXFF这两个字节开头,则表明文本的其余部分是Big-Endian的UTF-16编码;如果文件以OXFF OXFE这两个字节开头,则表明文本的其余部分是Little-Endian的UTF-16编码。
分享到:
相关推荐
字符编码过滤器 j2ee字符字符编码 字符编码过滤器 字符编码转换 post字符转换
易语言字符编码转换源码,字符编码转换
asp中有关字符编码转换的几个函数. asp中中文乱码是个难点,希望这几个函数对你有帮助
字符编码转换,支持任意编码转换,支持不限于GBK,UNICODE,UTF8,GB1830等等
Java中的字符集编码入门(五)Java代码中的字符编码转换Part1.pdf
字符编码转换 字符串到Unicode的转换等 字符高低位转换等。
NULL 博文链接:https://guomingzhang2008.iteye.com/blog/1693599
utf8 utf7 ascii unicode big5 gb2312....相互转换,10进制、16进制等显示方式,非常实用。
Qt字符转换,串口接收数据转为中文显示可用。Qt中的字符编码转换:UTF8、Unicode、GBK、ASCII、16进制字符、16进制数值
jquery字符编码转换[文].pdf
字符编码查看器是一款非常实用优秀的编程软件。这款软件支持编码之间的相互转换,可以帮助用户快速查看编码等。功能非常强大。需要的朋友可以前来本站下载。 软件介绍 字符编码查看器是一款可以帮助你轻松快速的...
字符编码转换,最终版,支持所有编码,支持不限于GBK,GB1830,utf8,只要系统能支持就能转换
Java字符编码转换过程说明,用这个可以用jdk里的程序完成字符编码转换
C语言字符编码转换UNICODE、GBK、UTF-8互相转换
使icon.lib实现编码转换
字符编码转换实用工具和socket调试工具
汉字或字母 的编码 在十六进制,二进制,ANSI 码等之间的转换
Java中的字符集编码入门(五)Java代码中的字符编码转换Part1.doc
万能编码转换器,支持十几种类型的字符编码转换;日期转换、时间戳转换、IP地址转换;格式整理;字数统计等功能,绿色小巧,功能强大。
Java中的字符集编码入门(五)Java代码中的字符编码转换Part1[参考].pdf