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

相关推荐