黑马程序员_对于字符编码及字符集的理解

来源:互联网 发布:漫画教程 知乎 编辑:程序博客网 时间:2024/05/21 17:23
---------------------- ASP.Net+Unity开发、.Net培训、期待与您交流! ----------------------

 对于字符编码及字符集的理解

       人们所使用的文字字符是图形,而计算机只识别0101这样的数据,为了让计算机识别文字,就需要把文字转化为数据,这个过程称为编码,在同一个编码中,文字与其字码是一一对应的。
       字符集和编码的关系。
       字符集(Charset):是一个系统支持的所有抽象字符的集合。字符是各种文字和符号的总称,包括各国家文字、标点符号、图形符号、数字等。
       字符编码(Character Encoding):是一套法则,使用该法则能够对自然语言的字符的一个集合(如字母表或音节表),与其他东西的一个集合(如号码或电脉冲)进行配对。即在符号集合与数字系统之间建立对应关系,它是信息处理的一项基本技术。
       也就是说,字符集表示里面包含了哪些字符。编码负责建立字符与数据的一一对应关系。

常见的字符集如下:
       最基本的字符集:ASCⅡ码。ASCII(American Standard Code for Information Interchange,美国信息交换标准代码)是基于拉丁字母的一套电脑编码系统。它主要用于显示现代英语。ASCⅡ码长度均为一个字节。
       中文常用的字符集GB2312、GBK到GB18030,后者兼容前者,并且它们都兼容ASCⅡ码。当字符为英文字符时长度为一个字节,等同于ASCⅡ码(ASCⅡ码的值均小于128,java中没有无符号整形,所以判断大于0即可)。当为中文字符时,用两个字节表示,第一个字节值大于128(JAVA中判断小于0),第二字节在0~255间取值(GB2312中,第二个字节仍在128~255间取值)。Big5,又称为大五码或五大码,是使用繁体中文(正体中文)社区中最常用的电脑汉字字符集标准,共收录13,060个汉字。
       国际通用字符集:Unicode。Unicode的学名是"Universal Multiple-Octet Coded Character Set",简称为UCS。UCS-2是固定长度为16位的unicode字符集。这样一共可以表示65536个字符。显然,这样要表示各种语言中所有的字符是远远不够的。Unicode4.0规范考虑到了这种情况,定义了一组附加字符编码,附加字符编码采用2个16位来表示,这样最多可以定义1048576个附加字符,目前unicode4.0只定义了45960个附加字符。UTF-8、UTF-16、UTF-32都是对Unicode的编码实现。(UTF-8是一种针对Unicode的可变长度字符编码,它的英文字符编码与ASCⅡ码完全相同。也就是说UTF-8兼容ASCⅡ码)。

摘抄的其他知识:big endian和little endian是CPU处理多字节数的不同方式。例如“汉”字的Unicode编码是6C49。那么写到文件里时,究竟是将6C写在前面,还是将49写在前面?如果将6C写在前面,就是big endian。如果将49写在前面,就是little endian。我们一般将endian翻译成“字节序”,将big endian和little endian称作“大尾”和“小尾”。
“endian”这个词出自《格列佛游记》。小人国的内战就源于吃鸡蛋时是究竟从大头(Big-Endian)敲开还是从小头(Little-Endian)敲开,由此曾发生过六次叛乱,一个皇帝送了命,另一个丢了王位。

UTF的字节序和BOM
UTF-8以字节为编码单元,没有字节序的问题。UTF-16以两个字节为编码单元,在解释一个UTF-16文本前,首先要弄清楚每个编码单元的字节序。例如“奎”的Unicode编码是594E,“乙”的Unicode编码是4E59。如果我们收到UTF-16字节流“594E”,那么这是“奎”还是“乙”?
Unicode规范中推荐的标记字节顺序的方法是BOM。BOM不是“Bill Of Material”的BOM表,而是Byte order Mark。BOM是一个有点小聪明的想法:
在UCS编码中有一个叫做"ZERO WIDTH NO-BREAK SPACE"的字符,它的编码是FEFF。而FFFE在UCS中是不存在的字符,所以不应该出现在实际传输中。UCS规范建议我们在传输字节流前,先传输字符"ZERO WIDTH NO-BREAK SPACE"。
这样如果接收者收到FEFF,就表明这个字节流是Big-Endian的;如果收到FFFE,就表明这个字节流是Little-Endian的。因此字符"ZERO WIDTH NO-BREAK SPACE"又被称作BOM。
UTF-8不需要BOM来表明字节顺序,但可以用BOM来表明编码方式。字符"ZERO WIDTH NO-BREAK SPACE"的UTF-8编码是EF BB BF(读者可以用我们前面介绍的编码方法验证一下)。所以如果接收者收到以EF BB BF开头的字节流,就知道这是UTF-8编码了。




---------------------- ASP.Net+Unity开发、.Net培训、期待与您交流! ----------------------
0 0
原创粉丝点击