参考资料
http://www.regexlab.com/zh/encoding.htm
字符与编码的发展
| 系统内码 | 说明 | 系统 |
阶段一 | ASCII | 计算机刚开始只支持英语,其它语言不能够在计算机上存储和显示。使用一个字节 | 英文 DOS |
阶段二 | ANSI编码 | 为使计算机支持更多语言,通常使用 0x80~0xFF 范围的 2 个字节来表示 1 个字符。比如:汉字 '中' 在中文操作系统中,使用 [0xD6,0xD0] 这两个字节存储。 | 中文 DOS,中文 Windows 95/98,日文 Windows 95/98 |
阶段三 | UNICODE | 为了使国际间信息交流更加方便,国际组织制定了 UNICODE 字符集,为各种语言中的每一个字符设定了统一并且唯一的数字编号,以满足跨语言、跨平台进行文本转换、处理的要求。 | Windows NT/2000/XP,Linux,Java |
字符集和编码
字符集:使用哪些字符。也就是说哪些汉字,字母和符号会被收入标准中。所包含“字符”的集合就叫做“字符集”。
编码:规定每个“字符”分别用一个字节还是多个字节存储,用哪些字节来存储,这个规定就叫做“编码”。
各个国家和地区在制定编码标准的时候,“字符的集合”和“编码”一般都是同时制定的。因此,平常我们所说的“字符集”,比如:GB2312, GBK, JIS 等,除了有“字符的集合”这层含义外,同时也包含了“编码”的含义。
常用的编码简介
分类 | 编码标准 | 说明 |
单字节字符编码 | ASCII | (American Standard Code for Information Interchange,美国信息互换标准代码),是基于常用的英文字符的一套电脑编码系统。我们知道英文中经常使用的字符、数字符号被计算机处理时都是以二进制码的形式出现的。这种二进制码的集合就是所谓的ASCII码。 |
单字节字符编码 | ISO-8859-1 | 最简单的编码规则,每一个字节直接作为一个 UNICODE 字符。比如,[0xD6, 0xD0] 这两个字节,通过 iso-8859-1 转化为字符串时,将直接得到 [0x00D6, 0x00D0] 两个 UNICODE 字符,即 "ÖÐ"。 |
ANSI 编码 | GB2312, | 把 UNICODE 字符串通过 ANSI 编码转化为“字节串”时,根据各自编码的规定,一个 UNICODE 字符可能转化成一个字节或多个字节。 |
UNICODE 编码 | UTF-8, | 与“ANSI 编码”类似的,把字符串通过 UNICODE 编码转化成“字节串”时,一个 UNICODE 字符可能转化成一个字节或多个字节。
|
UNICODE 编码对于英文都采用两个字节进行表示,在网络传输过程中会加大数据量。
UTF-8:Eight-bit UCS Transformation Format,(UCS,Universal Character Set,通用字符集,UCS 是所有其他字符集标准的一个超集)。一个7位的ASCII码值,对应的UTF码是一个字节。如果字符是0x0000,或在0x0080与0x007f之间,对应的UTF码是两个字节,如果字符在0x0800与0xffff之间,对应的UTF码是三个字节。(中文用UTF表示是三个字节,英语是一个字节)
程序中的字符与字节
类型或操作 | Java | C++ |
字符 | char | wchar_t |
字节 | byte | char |
ANSI 字符串 | byte[] | char[] |
UNICODE 字符串 | String | wchar_t[] |
字节串→字符串 | string = new String(bytes, "encoding") | mbstowcs(), MultiByteToWideChar() |
字符串→字节串 | bytes = string.getBytes("encoding") | wcstombs(), WideCharToMultiByte() |
编码和解码
编码:把“字符”转化成“字节”
解码:把“字节”转化成“字符”
字符串String在传输过程中,先按传送者本地“字符集编码A”自动编码为本地字符集“码值”(二进制字节串),然后进行传输。接收者接收到“二进制字节串”后,自动按照接收者的本地“字符集编码B”进行解码。在这个过程中,如果A和B不一样,就会出现乱码。
要想正确显示,则要先将“二进制字节串”按照“字符集编码B”编码为“二进制字节串”(字符集A的码值),然后按照“字符集编码A”对“二进制字节串”进行解码。