其实文本字符编码一直是国际化的一个重要内容,但是这一系列文章并不是针对国际化的.windows系统采用的是gb系统的字符集,而我使用的ubuntu则采用的是utf-8的编码,这为我的工作带来了很多不便.所以总结一下相关的知识.
第一章 字符编码
首先要注意一点的是,字符编码就是将字母或汉字与一串二进制数相对应.在内存中的字符串要用到它.将文本保存在硬盘上时,也要用到它.之所以提前这个,是因为两者有时并不完全相同.
下面是一些常见的字符编码及其特点:
1. ASCII码
ASCII码的字符集应该是最小的一个,也是最见的一个了.占一个字节.
详细请见: ASCII百度百科
2.Latin-1(ISO 8859-1)
ASCII码并没有使用0xA0-0xFF的范围,而Latin-1正是扩展了这个范围得到的,大部分的欧洲语言都能搞定.当然占一个字节.
详细请见: ISO 8859-1百度百科
3. GB系统
3.1 GB2312(也叫cp936)
这一类编码就是我们学计算机编码时最早接触的一种汉字编码,一个汉字对应2个字节,而且每个字节的最高位都是1.而ASCII的最高位是0,所以GB2312与ASCII可以混合存储.
VC6中,如果没有做其它设置,一个含有中文字符串的占字符数的计算就是依据的这种编码.汉字占2个字节.
3.2 GBK
国家标准扩展,扩展了GB2312中未使用的码点(code points)以表示更多的字符,最多占用两个字节。
使用1位或2位进行编码
字节为00-7F的表示与ASCII完全一致,即是有96个字符和32个控制码。
最高位为1的字节表示该字节是两字节(表示更多字符)中的高字节,高字节范围为81-FE,第二个字节(低字节)范围为40-FE,或者80-FE。
在GBK的编码规范里,GB2312只是其中一个子集。
3.3 GB18030
一二四变长编码
详细请见: 中文的几个编码 GB2312、GBK、GB18030、GB13000、BIG5
4. UNICODE(统一码、万国码、单一码)/UCS/UCS2/UCS4/utf-8/utf-16/utf-32
要完整的了解UNICODE请见:UNICODE百度百科
下面只简单总结几个要点:
1. UCS(universal character set)(由iso 10646定义)与UNICODE本是两个不同的项目,两个标准在字符编码位置上相同.
UCS码表是31位的,但是在内存中,并不是用31位去表示一个UCS字符.
2. UCS-2、UCS-4.
UCS-2用两个字节编码,UCS-4用4个字节编码。UCS-4根据最高位为0的最高字节分成2^7=128个group。每个group再根据次高字节分为256个平面(plane)。每个平面根据第3个字节分为256行 (row),每行有256个码位(cell)。group 0的平面0被称作BMP(Basic Multilingual Plane)。将UCS-4的BMP去掉前面的两个零字节就得到了UCS-2。
3. UNICODE可分为编码方式与实现方式两个层次.
UNICODE用数字0x0-0x10FFFF来映射这些字符,最多可以容纳1114112个字符,或者说有1114112个码位。码位就是可以分配给字符的数字。UTF-8、UTF-16、UTF-32都是将数字转换到程序数据的编码方案。
4. ASCII码在UTF-8中占一个字节.简体汉字在UTF-8中占三个字节.UTF-8编码的字节数可以从1个到6个.
5. 根据字节序的不同,UTF-16可以被实现为UTF-16LE或UTF-16BE,UTF-32可以被实现为UTF-32LE或UTF-32BE。
6. 关于BOM参见UNICODE百度百科
关于各种编码的一个较完整的表格可插找 这里 .而且这里提供了一种工具iconv ,可以将文本从一种编码(指定)转化为另一种编码(指定).