关于字符编码的小测试

建立一个文本文档,输入下列内容:

1234567890
abcdefghijklmnopqrstuvwxyz
ABCDEFGHIJKLMNOPQRSTUVWXYZ
一二三四五六七八九十零
随便输入的一句话

另存为成四个文件,编码分别选择ANSI,Unicode,Unicode big endian,UTF-8。
比如:
t1.txt 使用ANSI编码
t2.txt 使用Unicode编码,这个选项用的little endian格式,低位在前
t3.txt 使用Unicode big endian编码,和Unicode的区别是高位在前
t4.txt 使用UTF-8编码

  对于采用Intel处理器的平台,是按照低位在前的方式存储,比如存储字符2,Unicode显示为十六进制32 00,而使用Unicode big endian则会显示为00 32。

我们可以查看每个文档所占的字节数。
t1-108字节
t2-180字节
t3-180字节
t4-130字节

t1.txt

  用UltraEdit打开切换到十六进制编辑,可以看到ANSI编码字母数字占一个字节,汉字占两个字节,回车占两个字节(十六进制表示为0D 0A),0D 0A表示ASCII字符CR LF,即回车 换行。所以总共是10+2+26+2+26+2+22+2+16=108。

  tips:位于文档前非文档内容的前几个字符是相关编码的识别码,字节顺序标记。

t2.txt
  Unicode编码前两个字节为FF FE,后面的每一个字符都用两个字节编码,所以有2+(10+2+26+2+26+2+11+2+8)*2=180。

t3.txt

  Unicode big endian编码前两字节为FE FF,后面是把字符的高位放在前面,低位放在后面,正好和Unicode编码颠倒。大小还是180。

t4.txt

  而UTF-8编码前三个字节为EF BB BF,数字、字母、回车、换行都用一个字节表示。UTF-8是Unicode的一种变长字符编码,通俗来说就是够用就好。相比在Unicode编码里所有字符都用两个字节编码,对于在ASCII码范围内的数字、字母显然有一个字节是浪费的。根据换行回车,我们可以看到第四行的11个汉字占了33个字节,第五行的8个汉字占了24个字节。有此可看出一个汉字在UTF-8编码里占3个字节。因为Unicode编码中文范围4E00-9FBF:CJK 统一表意符号 (CJK Unified Ideographs),它是在00000800 – 0000FFFF范围内,所以要用3字节编码。

如何知道某个汉字的UTF-8编码?
  网上看到的,可以在google搜索里搜索这个汉字,比如搜索“一”,在&q=%E4%B8%80就是这个汉字的UTF-8编码E4 B8 80。

在文档内容前的几个字符有什么用呢?
  这前几个字符其实是BOM,它是用来判断字节序的。
  Unicode标准建议用BOM(Byte Order Mark)来区分字节序,即在传输字节流前,先传输被作为BOM的字符”零宽无中断空格”。对UTF8这个标记是可选的,因为UTF8字节没有顺序,所以它可以被用来检测一个字节流是否是UTF-8编码的。

下表是各种UTF编码的BOM:
UTF编码  ║ Byte Order Mark
UTF-8  ║ EF BB BF
UTF-16LE ║ FF FE
UTF-16BE ║ FE FF
UTF-32LE ║ FF FE 00 00
UTF-32BE ║ 00 00 FE FF