字符与字符编码
在开发过程中经常碰到字符编码的问题,有时候网页编码错误还会出现乱码。相应的字符编码还有一大堆名称:ASCII、Unicode、UTF-8、GB2312、GBK...到底这些字符编码是如何工作的?相信还有很多人和我有一样的疑问。
先了解一个概念:字符集
字符集是将一组字符编码成一系列八位字节数据的系统。
简单来说,字符集就是一个从字符到
需要了解的几个基本概念:
1. 抽象字符表(Abstract Character Repertoire)编码系统支持的所有抽象字符的集合,例如ACSII的{NULL,...0,1,2...A,B..}就是一个抽象字符表
2. 编码字符集(CCS:Coded Character Set)将字符集映射为一个坐标(x,y)或者一个非负整数N(称为码位code point值),例如ACSII中将“A”映射为65,字符集和码位映射称为编码字符集。所有码位构成编码空间。
3. 字符编码表(CEF:Character Encoding Form),也称为“Storage Format”,将码位转换为有限比特长度的整型值(码元code units),例如ASCII中A的码位为65码元为0x41(65)。
4. 字符编码方案(CEC:Character Encoding Scheme),也称作“Serialization Format”,将定长的整型值(码元)映射到8位字节序列,在使用Unicode(UTF-16)编码时会用到大端(高字节保存在地址的低位置中)和小端(高字节保存在地址的高地址中)。
了解了上面几个概念,再来一个一个分析。
ASCII字符集
ASCII编码空间为0-127,可表示128个字符。可以发现ASCII的码位值和码元值是相等的。ASCII是一种简单字符集。
Unicode字符集
Unicode也叫万国码、统一码,Unicode对世界上大部分的文字进行了整理、编码,全球通用,致力于取代既有的字符编码方案。Unicode的字符表超过十万个字符。
目前适用的Unicode版本为UCS-2,使用16比特的编码空间(256*256=65536)。还有UCS-4,使用32比特(2^32)的编码空间,完全可以涵盖一切语言所用的符号。
在Unicode中,字符"A"的码值是0x0041(U+0041),但是码元则需要根据不同的编码格式来确定,Unicode字符编码方式有UTF-8、UTF-16、UTF-32这三种。
UTF-8:UTF-8是一种针对Unicode的可变长度字符编码,在UTF-8中字符“A”表示为0x41(U+41)占一个byte。

浙公网安备 33010602011771号