了解字符的编码

  我们可以做个试验,使用记事本将“中国 ab”这个中英混杂的字符串以不同编码方式保存为多个“ .txt”文件,然后直接查看其二进制内容:

图1   比对字符编码

  图 1 展示了“中国 ab”按四种编码方式( ANSI、 UTF8、 Unicode、 Unicode Big Endian )得到的不同二进制数据。

  

  以英文字符“ a”为例, ANSI UTF8得到的数值都是“ 61”,但 Unicode将它扩充为 2个字节 16位的二进制(“ 61 00”和“ 00 61”),所以我们又将这种编码方式称为 UTF-16

       UTF-16 又可以细分为 2种编码方式: Big Endian方式与 Little_Edian方式,这两者的唯一区别在于字节排列顺序刚好相反, Little_Edian方式将“ a”编码为“ 61 00”,而 Big Endian方式则编码为“ 00 61”。

       现在看看中文字符,“中国”两个汉字, ANSI编码为“ D6 D0 B9 FA”, 4个字节,一个汉字占两个字节,而 UTF8则编码为“ E4 B8 AD E5 9B BD”, 6个字节,一个汉字占 3个字节!这说明 UTF8是一种“变长”的编码,可能使用 1~4个字节来表示某个字符。

       另外,我们看到 UTF8 Unicode编码(不管是 Big Endian还是 Little Endian )前面都有几个标记字符,这些字符放在文本文件的开头,称为“ BOM Byte Order Mark,字节顺序标记)”指明了文本的编码方式,以下是 .NET程序中常见的字符编码方式的 BOM值:

编码

BOM 值

UTF-8

EF BB BF

UTF-16   big endian

FE FF

UTF-16   little endian

FF FE

UTF-32   big endian

00 00 FE FF

UTF-32   little endian

FF FE 00 00

  了解了上述基础知识,我们就可以依据 BOM值自动检测字符串的编码方式,从而正确从二进制数据流中解码.

posted @ 2011-02-10 22:41  TsengYuen  阅读(503)  评论(0编辑  收藏  举报