Lars' Land (宝宝逾的天地) » 日志 » 计算机内的字符编码
计算机内的字符编码
Lars 发表于 2006-02-15 01:57:00
不得不说,宝宝不是一个self-motivated的人,但是一旦需要稍微了解一些东西的时候,却又老是去钻牛角尖。比如说以前在宝宝的MSN Space里面贴过一个Chelsea FC的阵容,带全名的。今天下午Richard同学给了我一个乱码邮件,我帮他看了一看,一开始也没有看的太明白,不过后来明白这个是什么问题了。顺便又开始钻牛角尖了,对计算机字符编码开始钻研了一下,算是有了一个大概的了解了。
字符(包括中文在内)编码,一般有两层的概念,首先是内码,就好像平时看到的GB2312、GBK这种对汉字进行编码,然后再进行编码,比如采用Base64或者QP以方便传送。看到有一个人打了一个比方,就好像内码呢好像把货物装入箱子,然后再编码就好像把箱子装在火车上;而用我们通信的术语,前者好像信源编码,而后者好像信道编码。
不打比方,言归正传了。我们电脑课本上面学习的英文是以ASCII来编码,而中文是以双字节的GB码来编码,随着计算机内存的逐渐增大,我们的GB字库也愈来愈大,现在把不太用的生僻字以及繁体字也包括进来了。而随着计算机内存和处理能力的不断增强,全世界共用一个字库的时代也已经到来了,如今的Windows系统内,用的基本都是Unicode编码了,Windows系统的内核基本上应该也已经是一个双字节系统了。Unicode用双字节表示了所有的文字,理论上可以表示65536个字符,基本可以满足所有语言符号了,而先在Windows XP里面有一个字体叫“Arial Unicode MS”,可以显示Unicode字符集中的绝大多数语言,比如藏语也可以显示。一般的英文字符,首字节采用00H,第二个字节就采用原来的ASCII码来表示;而简体中文的GB码虽然也是双字节的,但是和Unicode码并不一致,其中还有一个转换的问题。同时由于使用PC和Mac的平台不同,Unicode也有Big-Endian和Little-Endian之分,Windows用的应该是Little-Endian方式,也就是说字节的编码是高位在前低位在后的顺序。在HTML里面,可以用“&#nnnn”(nnnn表示十进制的Unicode码)来表示Unicode字符。
当然现在可以说是处于一个多种编码并存的一个混乱的时代,许多程序都是还是在老的平台下面开发的,所以文字用的内码还是GB而不是Unicode,所以在可以显示中文的英文版本的WinXP下面显示不出中文字来,可能显示出来的是一群“?”。而文件在计算机里面存储的方式也是多种编码并存,比如在WinXP的记事本程序里面可以选择用ANSI方式(也就是传统的ASCII码和GB码的方式)、也可以用Unicode或者UTF-8的方式存储。而选择这些方式会在文件头上多加入两个字节以表示编码方式,这就是为什么在记事本里面输入“联通”以后,再打开就显示不出来了,因为“联”恰好和表示UTF-8方式的那两个字节一摸一样。估计再过若干年以后,都用Unicode了以后,全世界估计就再不用考虑转码的问题了,当然台海两岸的人交流也方便多了。
当然这里还要提一下UTF(Unicode Translation Format),这是一种Unicode字符的表示方式,比如一个汉字的两个字节16bit在通用的UTF-8中采用“1110xxxx 10xxxxxx 10xxxxxx”来表示,占用3个字节;而普通的英文只用7bit就可以表示,则采用“0xxxxxxx”来表示,占用1个字节;我想这样表示主要是为了增加纠错能力,不过这种变长的编码方式造成的实际结果却是增加了复杂程度,所以计算机内部并不采用,只是在网页编码上被采用。而计算机内部所采用的就是双字节的Unicode码,也就是UTF-16(也叫UCS-2)。
在弄清楚内码之后,base64和QP编码就变得简单了,这些编码方式处理的对象是字节,而不再关心先前的编码方式是Unicode还是GB码,甚至根本就是一个二进制的文件了。这两种编码方式主要是应用在MIME编码的Email系统里面,主要是原先的邮件系统只能处理7bit的普通英文内容。选择哪种通常取决于邮件系统本身。比如说,Gmail用的就是base64,而Yahoo则就直接使用8bit的明文来传送了,而Outlook里面则是可以三种方式都可以选择。
base64编码方式,是一组由64个不同字符表示的编码。这64个字符由大小写52个英文字母、10个数字、还有“+”和“/”构成,可以表示6bit的内容。三个字节是24bit,刚好可以用4个字符来表示,如果长度不足4个字符,就用"=“来补足。从编码效率上面来看,是编码前内容的4/3。UTF-7的编码模式就是指用base64对8bit的Unicode进行编码,用+和-括起来,比如“+Z06XB1uH-”,但是对于7bit字符就不再进行base64编码了。通常在手机里面,就是用这种方式来对短消息和电话本的汉字进行编码的,这样我就可以自己来编个程序,管理手机电话簿了,这也是我这次狂看中文编码的动机之一。
QP编码的全称就是Quoted-printable(Outlook里面翻译成”括上的可打印项目“),是用"=nn“(nn为字节的16进制编码)的形式来表示8bit字节的方法,而对于7bit的普通英文内容,则是保留原先的内容不变,比如”=E6=C4abdE=A5=B2“,中间的”abd“就不再编码了。对于普通的8bit字节,编码效率就比较低了,是编码前内容的3倍,但是由于对7bit内容不再编码,所以如果邮件内容当中英文多的话,选择QP编码方式比较经济;而如果是非英文或者带附件的,用base64就比较好了。
而像Yahoo这样子直接采用8bit系统的,就完全没有编码的问题了,效率也最高,但是前提是要收邮件的系统能够支持了,不过这个现在基本上也已经不是问题了。
在PHP里面的相关函数
(使用IMAP类的函数,必须在php.ini中开启php_imap.dll)
转换base64编码的函数:
编码函数:string base64_encode (string data) 或者 string imap_binary (string string)
解码函数:string base64_decode (string data) 或者 string imap_base64 (string string)
转换QP编码的函数:
编码函数:string quoted_printable_encode (string data) 或者 string imap_8bit (string string)
解码函数:string quoted_printable_decode (string data) 或者 string imap_qprint (string string)
转换UTF-8的函数:
编码函数:string utf8_encode (string data) 或者 string imap_utf8 (string mime_encoded_text)
解码函数:string utf8_encode (string data)
转换UTF-7的函数:
编码函数:string imap_utf7_encode (string data)
解码函数:string imap_utf7_decode (string data)
参考资料:
中文Wikipedia
英文Wikipedia
(以上需要设置代理服务器”145.97.39.133 “可以访问)
MIME邮件编码:RFC2045
UTF-7编码:RFC1642
字符(包括中文在内)编码,一般有两层的概念,首先是内码,就好像平时看到的GB2312、GBK这种对汉字进行编码,然后再进行编码,比如采用Base64或者QP以方便传送。看到有一个人打了一个比方,就好像内码呢好像把货物装入箱子,然后再编码就好像把箱子装在火车上;而用我们通信的术语,前者好像信源编码,而后者好像信道编码。
不打比方,言归正传了。我们电脑课本上面学习的英文是以ASCII来编码,而中文是以双字节的GB码来编码,随着计算机内存的逐渐增大,我们的GB字库也愈来愈大,现在把不太用的生僻字以及繁体字也包括进来了。而随着计算机内存和处理能力的不断增强,全世界共用一个字库的时代也已经到来了,如今的Windows系统内,用的基本都是Unicode编码了,Windows系统的内核基本上应该也已经是一个双字节系统了。Unicode用双字节表示了所有的文字,理论上可以表示65536个字符,基本可以满足所有语言符号了,而先在Windows XP里面有一个字体叫“Arial Unicode MS”,可以显示Unicode字符集中的绝大多数语言,比如藏语也可以显示。一般的英文字符,首字节采用00H,第二个字节就采用原来的ASCII码来表示;而简体中文的GB码虽然也是双字节的,但是和Unicode码并不一致,其中还有一个转换的问题。同时由于使用PC和Mac的平台不同,Unicode也有Big-Endian和Little-Endian之分,Windows用的应该是Little-Endian方式,也就是说字节的编码是高位在前低位在后的顺序。在HTML里面,可以用“&#nnnn”(nnnn表示十进制的Unicode码)来表示Unicode字符。
当然现在可以说是处于一个多种编码并存的一个混乱的时代,许多程序都是还是在老的平台下面开发的,所以文字用的内码还是GB而不是Unicode,所以在可以显示中文的英文版本的WinXP下面显示不出中文字来,可能显示出来的是一群“?”。而文件在计算机里面存储的方式也是多种编码并存,比如在WinXP的记事本程序里面可以选择用ANSI方式(也就是传统的ASCII码和GB码的方式)、也可以用Unicode或者UTF-8的方式存储。而选择这些方式会在文件头上多加入两个字节以表示编码方式,这就是为什么在记事本里面输入“联通”以后,再打开就显示不出来了,因为“联”恰好和表示UTF-8方式的那两个字节一摸一样。估计再过若干年以后,都用Unicode了以后,全世界估计就再不用考虑转码的问题了,当然台海两岸的人交流也方便多了。
当然这里还要提一下UTF(Unicode Translation Format),这是一种Unicode字符的表示方式,比如一个汉字的两个字节16bit在通用的UTF-8中采用“1110xxxx 10xxxxxx 10xxxxxx”来表示,占用3个字节;而普通的英文只用7bit就可以表示,则采用“0xxxxxxx”来表示,占用1个字节;我想这样表示主要是为了增加纠错能力,不过这种变长的编码方式造成的实际结果却是增加了复杂程度,所以计算机内部并不采用,只是在网页编码上被采用。而计算机内部所采用的就是双字节的Unicode码,也就是UTF-16(也叫UCS-2)。
在弄清楚内码之后,base64和QP编码就变得简单了,这些编码方式处理的对象是字节,而不再关心先前的编码方式是Unicode还是GB码,甚至根本就是一个二进制的文件了。这两种编码方式主要是应用在MIME编码的Email系统里面,主要是原先的邮件系统只能处理7bit的普通英文内容。选择哪种通常取决于邮件系统本身。比如说,Gmail用的就是base64,而Yahoo则就直接使用8bit的明文来传送了,而Outlook里面则是可以三种方式都可以选择。
base64编码方式,是一组由64个不同字符表示的编码。这64个字符由大小写52个英文字母、10个数字、还有“+”和“/”构成,可以表示6bit的内容。三个字节是24bit,刚好可以用4个字符来表示,如果长度不足4个字符,就用"=“来补足。从编码效率上面来看,是编码前内容的4/3。UTF-7的编码模式就是指用base64对8bit的Unicode进行编码,用+和-括起来,比如“+Z06XB1uH-”,但是对于7bit字符就不再进行base64编码了。通常在手机里面,就是用这种方式来对短消息和电话本的汉字进行编码的,这样我就可以自己来编个程序,管理手机电话簿了,这也是我这次狂看中文编码的动机之一。
QP编码的全称就是Quoted-printable(Outlook里面翻译成”括上的可打印项目“),是用"=nn“(nn为字节的16进制编码)的形式来表示8bit字节的方法,而对于7bit的普通英文内容,则是保留原先的内容不变,比如”=E6=C4abdE=A5=B2“,中间的”abd“就不再编码了。对于普通的8bit字节,编码效率就比较低了,是编码前内容的3倍,但是由于对7bit内容不再编码,所以如果邮件内容当中英文多的话,选择QP编码方式比较经济;而如果是非英文或者带附件的,用base64就比较好了。
而像Yahoo这样子直接采用8bit系统的,就完全没有编码的问题了,效率也最高,但是前提是要收邮件的系统能够支持了,不过这个现在基本上也已经不是问题了。
在PHP里面的相关函数
(使用IMAP类的函数,必须在php.ini中开启php_imap.dll)
转换base64编码的函数:
编码函数:string base64_encode (string data) 或者 string imap_binary (string string)
解码函数:string base64_decode (string data) 或者 string imap_base64 (string string)
转换QP编码的函数:
编码函数:string quoted_printable_encode (string data) 或者 string imap_8bit (string string)
解码函数:string quoted_printable_decode (string data) 或者 string imap_qprint (string string)
转换UTF-8的函数:
编码函数:string utf8_encode (string data) 或者 string imap_utf8 (string mime_encoded_text)
解码函数:string utf8_encode (string data)
转换UTF-7的函数:
编码函数:string imap_utf7_encode (string data)
解码函数:string imap_utf7_decode (string data)
参考资料:
中文Wikipedia
英文Wikipedia
(以上需要设置代理服务器”145.97.39.133 “可以访问)
MIME邮件编码:RFC2045
UTF-7编码:RFC1642
相关日志:
- » 董家渡的衣裳大评鉴
- » CAD/C集成技术
- » CAD/C集成技术
- » 用诺顿11.0杀毒软件
- » 变电站自动化技术培训教材
收藏:
QQ书签
del.icio.us
订阅:
Google
抓虾
