locale是地区的意思,linux里locale是根据用户使用的语言,所在地区,习惯等等定义的一个软件的运行时环境,就是一些环境变量的集合,以LC_开头。常见的如下
locale的格式形如en_US.UTF-8,前面是语言和地区,后面是字符集。语言和地区定义文件放在/usr/share/i18n/locales,字符集定义在/usr/share/i18n/charmaps。组合之后的locale信息放在/usr/lib/locale/locale-archive里,是二进制文件。locale命令可以查看和创建locale。locale -a列出所有已有的locale。
常用语言和地区有zh_CN(中文,中华人民共和国), zh_TW(中文,中国台湾地区), zh_HK(中文,中国香港地区), en_US(英文,美国), en_GB(英文,英国)等。
常用字符集有ASCII, BIG5, GB18030, GB2312, GBK, UTF-8, Unicode, UTF-8/16/32等。
常用的locale有en_US.utf8,zh_CN.utf8,和POSIX定义的最基本的C。
字符集定义两个标准,一个是编码方式,即字符和二进制字节串数值的对应关系,二是编码的存储和传输方式。
比如ASCII,编码方式是128个字符对应0~127共128个数值,存储方式是一个字符占用一个字节的存储空间,传输也是一个字节一个字节传输。
而Unicode,只定义了字符和数值的对应关系,没有定义存储和传输的方法。UTF-8/16/32就是基于Unicode的存储和传输标准,比如用几个字节存储编码,存储和传输时是大端还是小端。
1.ASCII
128个字符,包括0x20一下的终端控制码,如换行,鸣响,反白等,和英文大小写,数字,标点符号。扩展的ASCII有256个,包括制表符等。占用一个字节的存储空间。
2.GB2312
是对ASCII的扩展。小于等于127的单个字节被解析为ASCII字符,两个大于127的字节凑在一起就表示一个汉字,汉字的第一个字节数值从0xA1到0xF7,第二个字节从0xA1到0xFE。一共组成7000个字符,包括汉字,希腊罗马字母,日文,另外还把ASCII的数字标点和字母按照两个字节重新编码,叫做全角字符,原来的ASCII就叫半角字符。
3.GBK
在GB2312上继续扩展,新增了20000个汉字,包括繁体。
4.GB18030
在GBK上增加了少数民族语言的字符。整个GB标准被统称为DBCS(Double Byte Charecter Set 双字节字符集),特点就是要检查一个字节的值是否大于127,来决定按照单字节解析为ASCII还是按照双字节解析为汉字。
5.BIG5
台湾的汉字字符标准
6.UCS(Unicode)
ISO制定的标准,期望将世界上所有的字符都纳入一个字符集当中。可容纳100多万个字符。但并没有规定存储方式。比如较小的数值可能只需要一个字节就能存储,而大的可能需要4个字节。可以采用定长4字节存储,但表示英文时,相对于ASCII会严重浪费存储空间。所以一般采用变长存储,这就是UTF字符集。
7.UTF-8
规定了unicode的存储和传输。是变长存储标准,用1~4个字节存储字符的编码。标准如下
(1)对于单字节字符,和ASCII码相同,127以下
(2)对于n字节的符号(n>1),第一个字节的前n位都设为1,第n+1位设为0,后面字节的前两位一律设为10。剩下的没有提及的二进制位,全部为这个符号的unicode码。
Unicode符号范围 UTF-8编码方式
(十六进制) (二进制)
0000 0000-0000 007F 0xxxxxxx
0000 0080-0000 07FF 110xxxxx 10xxxxxx
0000 0800-0000 FFFF 1110xxxx 10xxxxxx 10xxxxxx
0001 0000-0010 FFFF 11110xxx 10xxxxxx 10xxxxxx 10xxxxxx
但是这样存储后,unicode的编码和UTF-8存储的数值就不一样了,但是他们之间可以通过程序转换。
缺点是一个汉字要用3个字节表示。
8.UTF-16
常用英文和汉字都占用两个字节。英文多的话UTF-8省空间,英文少则UTF-16省空间
9.UTF-32
4字节定长存储编码,太浪费了。
参考
http://blog.csdn.net/z4213489/article/details/7937894
http://www.zhihu.com/question/23374078