Unicode和UTF系列(1)
Unicode和UTF系列
Unicode
Unicode字符集收录了这世界上所有的文字符号和特殊符号。对于每一个符号都定义了一个值,称为代码点(codepoint)。代码点可以用2个字节表示(UCS-2),也可以用4个字节(UCS-4编码)。
UTF系列
为什么出现UTF编码?
UCS编码虽然定义了每个代码点的编码方式,但是没规定如何传输和存储。比如,在UCS-2码中,英文符号是在ACSII码的前面加上一个0byte,像"A"的ASCII码0x41,在UCS码中就是0x0041,这样,对于英文系统来讲会出现大量的0byte,造成不必要的浪费。而且容易存在对现在ASCII码不兼容的问题。所以这个重担就落在了UTF编码身上,全称是UnicodeTransformationFormat。
什么是Endian?
我们知道"中"字的UFT-16编码是0x4E,0x2D,但是传输存储的过程中,字节的顺序有可能是(0x4E,0x2D),也可能是(0x2D,0x4E),这就是涉及一个字节序的问题。对于前一种,我们称为BigEndian(大尾,也就是高位在前),而后一总称为LittleEndian(小尾,低位在前)。
那我们如何知道在不清楚哪一"尾"的情况下进行解析?
先人已有解决的办法,就是在最前面加多2个字节,OxFEFF表示BE,而0xFFFE表示LE。(注:OxFEFF是实际上不存在的字符,所以正常情况下是不会使用到的,所以,不用担心出现与正常的字符数据冲突的问题),这就是所谓的BOM(BillOfMaterial)。
UTF系列都存在LE,BE,BOM,无BOM几种版本。
比如"中国"的各个版本UTF-16字符编码如下:
编码字节序列
UTF-16BE4E,2D,56,FD
UTF-16LE2D,4E,fD,56
UTF-16(BOM,BE)FE,FF,4E,2D,56,FD
UTF-16(BOM,LE)FF,FE,2D,4E,fD,56