曾几何时,多次研究过字符编码的问题,每次都是了解到大部分,以至于出现新的编码问题时还不得不去重新寻找资料。在这里我重新完整的整理一遍,简明扼要,分享出来也方便日后查看。
1.常见的字符编码,按照轻到重介绍
1-1.ASCII
最基本的编码,西文字符集的国际标准,有7位(128标准字符)和8位(128标准字符+128扩充字符)两种。
1-2.GB2312
GB开头的都是国标码,也就是中国制定的编码。简体中文字符集,2字节(16位)存储,7000多个简体汉字字符。
1-3.GBK
对GB2312的扩展,完全兼容GB2312,多加了繁体字,2字节(16位)存储,20000多个汉字字符。
1-4.GB18030
对GBK的扩展,良好兼容GBK和GB2312,多加了少数名族文字,变长编码,有1、2、4字节的。
1-5.ISO-8859-1
国际标准化组织制定的,又称Latin-1或西欧语言,当然还有ISO-8859-2(Latin-2或叫中欧语言)。。。。。。单字节(8位),不支持中文。这下知道为什 么eclipse的properties文件默认ISO-8859-1不能保存中文了吧,都要设置成GBK或者UTF-8才行。
1-6.ANSI
这个最诡异了,不同国家和地区编码有不同标准,在英文操作系统下代表ASCII,在简体中文操作系统下代表GB2312,在日文操作系统下代表JIS。。。。。。可 以理解为本地编码,或者严格来说不算是编码,是个代号。存储单元嘛当然是变动的了,理解为指向某种编码的指针也可以。
1-7.UNICODE
这个编码是真正的实现了世界字符的一统。固定长度(4字节,在某个国际标准下,某个国际标准是2字节),世界上每一种字符都对应着一个Unicode编码。弊端也显而易 见,存储单字节的英文浪费空间,效率不高。有时候我们看到一些编辑器转码后产生\ua2b3\u43ab就是转换成Unicode的方式表示,\u是声明16进制的意思,后面跟 上4个16进制的数,如a2b3。做web国际化时候这个没少解除吧。
1-8.UTF-8
简单说,就是为了解决UNICODE的弊端出现了可变长度的UTF-8。
2.各种操作系统默认编码
先声明,部分操作系统是可以更改系统编码的,如Linux。这里列举的是最常规的情况。
Linux------UTF-8(你喜欢装中文版自己面壁去)
P-Windows3.2和苹果OS就是以GB2312为基本汉字编码
Windows 95/98以及以上则以GBK为基本汉字编码,记得cmd下使用mysql必须执行的set names gbk么
3.关于回车换行(\r\n)
这个还是挺让人疑惑的。
\r代表回车,就是把光标移动到行首
\n代表换行,就是光标移动到下一行
也许你钻牛角尖,换行不就行了,为什么还要回车?早起的OS很傻,你要是换行不回车,光标往下移动一行,但是不会置于行首。这个OS主要就是指WINDOWS,所以 在WINDOWS里面这个传统延续到今天。当然,不同的OS有不同的表现,有映象看过一份材料,如果你要真正“换行”,如下:
WINDOWS--------\r\n(回车换行)
LINUX--------------\n(只有换行,没有回车)
MAC OS X---------\r(只有回车,没有换行)
MAC OS X应该不叫IOS吧?高手指点咯
以上细微区别在用vim处理文本的时候要特别小心,尤其是使用了正则表达式。