[转]字符集编码
上一篇 / 下一篇 2007-10-25 13:16:48 / 天气: 阴雨 / 心情: 郁闷 / 个人分类:工作积累
这是一篇程序员写给程序员的趣味读物。所谓趣味是指可以比较轻松地了解一些原来不清楚的概念,增进知识,类似于打RPG游戏的升级。整理这篇文章的动机是两个问题:51Testing软件测试网+v1e2s7vzI_
问题一:
使用Windows记事本的“另存为”,可以在GBK、Unicode、Unicode big endian和UTF-8这几种编码方式间相互转换。同样是txt文件,Windows是怎样识别编码方式的呢?51Testing软件测试网T0bb A9d"s K51Testing软件测试网*gm2mLUF3R'B
我很早前就发现Unicode、Unicode big
endian和UTF-8编码的txt文件的开头会多出几个字节,分别是FF、FE(Unicode),FE、FF(Unicode big
endian),EF、BB、BF(UTF-8)。但这些标记是基于什么标准呢?
*k"q)yYw$d$p{0
问题二:
最近在网上看到一个ConvertUTF.c,实现了UTF-32、UTF-16和UTF-8这三种编码方式的相互 转换。对于Unicode(UCS2)、GBK、UTF-8这些编码方式,我原来就了解。但这个程序让我有些糊涂,想不起来UTF-16和UCS2有什么 关系。Z1m^8BQ1W e$U~ K051Testing软件测试网,D%lu7X(@.Es
查了查相关资料,总算将这些问题弄清楚了,顺带也了解了一些Unicode的细节。作者写成一篇文章,送给有过类似疑问的朋友。本文在写作时尽量做到通俗易懂,但要求读者知道什么是字节,什么是十六进制。51Testing软件测试网-a o6b+Z0W
0、big endian和little endian
big endian和little endian是CPU处理多字节数的不同方式。例如“汉”字的Unicode编码是6C49。那么写到文件里时,究竟是将6C写在前面,还是将49写在前 面?如果将6C写在前面,就是big endian。如果将49写在前面,就是little endian。51Testing软件测试网O{p^?{l7[T`[e51Testing软件测试网pg;g2rc_ o
“endian”这个词出自《格列佛游记》。小人国的内战就源于吃鸡蛋时是究竟从大头(Big-Endian)敲开还是从小头(Little-Endian)敲开,由此曾发生过六次叛乱,一个皇帝送了命,另一个丢了王位。51Testing软件测试网;U6Tw.KX+k)h
51Testing软件测试网z1Mj6FD3v;W"d]
我们一般将endian翻译成“字节序”,将big endian和little endian称作“大尾”和“小尾”。
4?,Fy0pI,[051Testing软件测试网*O En ]Xb(Ej,g
1、字符编码、内码,顺带介绍汉字编码
r;Qp9LO!NCn0字符必须编码后才能被计算机处理。计算机使用的缺省编码方式就是计算机的内码。早期的计算机使用7位的ASCII编码,为了处理汉字,程序员设计了用于简体中文的GB2312和用于繁体中文的big5。51Testing软件测试网$[n7A6p/M6s'V
GB2312(1980年)一共收录了7445个字符,包括6763个汉字和682个其它符号。汉字区的内码范围高字节从B0-F7,低字节从A1-FE,占用的码位是72*94=6768。其中有5个空位是D7FA-D7FE。51Testing软件测试网&T2QN6y_N/BK