首页 > 代码库 > 关于字符编码的那些事儿

关于字符编码的那些事儿

字符编码其实没有几种,它只是一个标准,但是如果没有特别的去了解过的话,也是很容易被搞糊涂的。

今日随意翻了一下,稍微了解了一点,隧记录下来。

#1 现代浏览器默认的字符集是 ISO-8859-1,如果不是则需要在 <meta> 部分进行指定。

 

#2 Unicode 标准:涵盖了世界上所有的字符、标点和符号。

 

#3 Unicode 的应用范围: XML、Java、ECMAScript(JavaScript)、LDAP、CORBA3.0、WML。

 

#4 UTF-8 和 UTF-16是Unicode 的一种转换形式。

UTF-8 字符可以是1-4个字节,向后兼容ASC-II, UTF-16 占2个字节的可变字符编码。用于OS以及一些字节码。

 

#5 一般操作系统会使用默认的ANSI的编码,在中文操作系统中一般使用GB..

ANSI的致命缺陷是: 每个标准之间都存在着编码重叠的问题。

 

#6 MBCS:Muti – Byte Chactacter System (Set)

多字节字符系统或字符集。需要几个字节就存放几个字节。C语言默认的是MBCS格式。

 

#7 Universal Code : 实际上需要3个字节,考虑到便利性,理论上用4个。

 

#8 UTF-8 的转换方式

 

互联网的普及,强烈要求出现一种统一的编码方式。UTF-8就是在互联网上使用最广的一种Unicode的实现方式。其他实现方式还包括UTF-16(字符用两个字节或四个字节表示)和UTF-32(字符用四个字节表示),不过在互联网上基本不用。重复一遍,这里的关系是,UTF-8是Unicode的实现方式之一。

UTF-8最大的一个特点,就是它是一种变长的编码方式。它可以使用1~4个字节表示一个符号,根据不同的符号而变化字节长度。

UTF-8的编码规则很简单,只有二条:

1)对于单字节的符号,字节的第一位设为0,后面7位为这个符号的unicode码。因此对于英语字母,UTF-8编码和ASCII码是相同的。

2)对于n字节的符号(n>1),第一个字节的前n位都设为1,第n+1位设为0,后面字节的前两位一律设为10。剩下的没有提及的二进制位,全部为这个符号的unicode码。

下表总结了编码规则,字母x表示可用编码的位。

 

Unicode符号范围 | UTF-8编码方式(十六进制) | (二进制)--------------------+---------------------------------------------0000 0000-0000 007F | 0xxxxxxx0000 0080-0000 07FF | 110xxxxx 10xxxxxx0000 0800-0000 FFFF | 1110xxxx 10xxxxxx 10xxxxxx0001 0000-0010 FFFF | 11110xxx 10xxxxxx 10xxxxxx 10xxxxxx

 

跟据上表,解读UTF-8编码非常简单。如果一个字节的第一位是0,则这个字节单独就是一个字符;如果第一位是1,则连续有多少个1,就表示当前字符占用多少个字节。

 

#9 实例:

下面,举一个实例。

打开"记事本"程序Notepad.exe,新建一个文本文件,内容就是一个"严"字,依次采用ANSI,Unicode,Unicode big endian 和 UTF-8编码方式保存。

然后,用文本编辑软件UltraEdit中的"十六进制功能",观察该文件的内部编码方式。

1)ANSI:文件的编码就是两个字节"D1 CF",这正是"严"的GB2312编码,这也暗示GB2312是采用大头方式存储的。

2)Unicode:编码是四个字节"FF FE 25 4E",其中"FF FE"表明是小头方式存储,真正的编码是4E25。

3)Unicode big endian:编码是四个字节"FE FF 4E 25",其中"FE FF"表明是大头方式存储。

4)UTF-8:编码是六个字节"EF BB BF E4 B8 A5",前三个字节"EF BB BF"表示这是UTF-8编码,后三个"E4B8A5"就是"严"的具体编码,它的存储顺序与编码顺序是一致的。

 

参考连接:

吐舌笑脸

http://www.ruanyifeng.com/blog/2007/10/ascii_unicode_and_utf-8.html

http://blog.csdn.net/softman11/article/details/6124345

关于字符编码的那些事儿