linux locale和字符集

locale

locale是地区的意思,linux里locale是根据用户使用的语言,所在地区,习惯等等定义的一个软件的运行时环境,就是一些环境变量的集合,以LC_开头。常见的如下

  • LC_CTYPE 语言符号
  • LC_NUMERIC 数字
  • LC_TIME 时间格式
  • LC_COLLATE 比较和排序习惯
  • LC_MONETARY 货币
  • LC_MESSAGES 提示信息,状态信息等
  • LC_NAME 姓名书写和显示习惯
  • LC_ADDRESS 地址格式
  • LC_TELEPHONE 电话号码格式
  • LC_MEASUREMENT 度量衡
  • LC_PAPER 纸张尺寸
  • LC_IDENTIFICATION 对locale自身包含信息的概述
  • LC_ALL 设置之后会覆盖所有其他LC变量。
  • LANG 最低优先级的设置,如果所有LC_*都没有设置,则使用LANG

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

你可能感兴趣的:(linux)