这是一篇程序员写给程序员的趣味读物。所谓趣味是指可以比较轻松地了解一些原来不清楚的概念,增进知识,类似于打rpg游戏的升级。整理这篇文章的动机是两个问题:
使用windows记事本的“另存为”,可以在gbk、unicode、unicode big endian与utf-8这几种编码方式间相互转换。同样是txt文件,windows是怎样识别编码方式的呢? 【相关文章:世界上最早的100个域名】 问题一: 【扩展阅读:操作系统的实现细节(2)】 问题二: 【扩展信息:crontab定时时间计算方法】 我很早前就发现unicode、unicode big endian与utf-8编码的txt文件的开头会多出几个字节,分别是ff、fe(unicode),fe、ff(unicode big endian),ef、bb、bf(utf-8)。但这些标记是基于什么标准呢? 最近在网上看到一个convertutf.c,实现了utf-32、utf-16与utf- 8这三种编码方式的相互转换。对于unicode(ucs2)、gbk、utf-8这些编码方式,我原来就了解。但这个程序让我有些糊涂,想不起来utf -16与ucs2有什么关系。 查了查相关资料,总算将这些问题弄清楚了,顺带也了解了一些unicode的细节。写成一篇文章,送给有过类似疑问的朋友。本文在写作时尽量做到通俗易懂,但要求读者知道什么是字节,什么是十六进制。 0、big endian与little endian big endian与little endian是cpu处理多字节数的不同方式。例如“汉”字的unicode编码是6c49。那么写到文件里时,究竟是将6c写在前面,还是将49写在前 面?如果将6c写在前面,就是big endian。还是将49写在前面,就是little endian。 “endian”这个词出自«格列佛游记»。小人国的内战就源于吃鸡蛋时是究竟从大头(big-endian)敲开还是从小头(little-endian)敲开,由此曾发生过六次叛乱,其中一个皇帝送了命,另一个丢了王位。 我们一般将endian翻译成“字节序”,将big endian与little endian称作“大尾”与“小尾”。 1、字符编码、内码,顺带介绍汉字编码 字符必须编码后才能被计算机处理。计算机使用的缺省编码方式就是计算机的内码。早期的计算机使用7位的ascii编码,为了处理汉字,程序员设计了用于简体中文的gb2312与用于繁体中文的big5。 gb2312(1980年)一共收录了7445个字符,包括6763个汉字与682个其它符号。汉字区的内码范围高字节从b0-f7,低字节从a1-fe,占用的码位是72*94=6768。其中有5个空位是d7fa-d7fe。 gb2312支持的汉字太少。1995年的汉字扩展规范gbk1.0收录了21886个符 号,它分为汉字区与图形符号区。汉字区包括21003个字符。2000年的gb18030是取代gbk1.0的正式国家标准。该标准收录了27484个汉 字,同时还收录了藏文、蒙文、维吾尔文等主要的少数民族文字。现在的pc平台必须支持gb18030,对嵌入式产品暂不作要求。所以手机、mp3一般只支持gb2312。... 下一页