Pages

Friday, 3 March 2017

Locale就是这么简单

Locale是国际化与本土化过程中的一个非常重要的概念,是根据计算机用户所使用的语言,所在国家或者地区,以及当地的文化传统所定义的一个软件运行时的语言环境。每种Locale以语言(Language), 地域 (Territory) 和字符集(Codeset)为Key,Key格式为语言[语言[_地域][.字符集] [@修正值]。
Locale按照所涉及到的文化传统的各个方面分成12个彼此独立设置的大类
语言符号及其分类(LC_CTYPE)
数字(LC_NUMERIC)
比较和排序习惯(LC_COLLATE)
时间显示格式(LC_TIME)
货币单位(LC_MONETARY)
信息主要是提示信息,错误信息, 状态信息, 标题, 标签, 按钮和菜单等(LC_MESSAGES)
姓名书写方式(LC_NAME)
地址书写方式(LC_ADDRESS)
电话号码书写方式(LC_TELEPHONE)
度量衡表达方式(LC_MEASUREMENT)
默认纸张尺寸大小(LC_PAPER)
对locale自身包含信息的概述(LC_IDENTIFICATION)。
 LC_CTYPE 规定了系统内有效的字符以及这些字符的分类,诸如什么是大写字母,小写字母,大小写转换,标点符号、可打印字符和其他的字符属性等方面。locale定义zh_CN时,使用LC_CTYPE确定了一个Unicode范围作为可识别汉字范围。实质上就代表了字符集的概念。
字符集就是字符在系统内的编码方式(内码),所有的字符集都放在 /usr/share/i18n/charmaps,用Unicode编号索引。
Unicode用统一的编号来索引目前已知的全部的符号,编号用四个字节存储。而字符集则是索引的编码方式。UTF-8字符集用一个字节表示常用的拉丁字母,用两个字节表示常用的符号,包括常用的中文字符,用三个表示不常用的字符,用四个字节表示其他字符。GB2312字符集就是用两个字节表示所有的字符。
zh_CN.GB2312=中文_中华人民共和国+国标2312字符集。
zh_CN.GB18030=中文_中华人民共和国+国标18030字符集。
zh_TW.BIG5=中文_台湾.大五码字符集
en_GB.ISO-8859-1=英文_大不列颠.ISO-8859-1字符集
de_DE.UTF-8@euro=德语_德国.UTF-8字符集@按照欧洲习惯加以修正

Locale在ubuntu系统中的位置

/usr/share/locale    这个里面有各个国际标准语言的信息
/usr/share/locale-langpack/    这里是一些语言的操作系统组件信息翻译。
/usr/share/locales/    这个里面有两个脚本分别用来生成和删除语言包的,它使用了/usr/sbin/locale-gen这个工具。
/usr/share/i18n/charmaps   这个里面是字符集,也就是内码文件。
/usr/share/i18n/locales    这个里面是每个语言的默认Locale定义文件。
locale生成有专用的工具,一般为glibc中的localedef。生成的locale放在/usr/lib/locale/目录中,每个locale对应一个文件夹。
但操作系统会隐藏这个工具,而提供另外的一个工具,这个工具通过读取一个配置文件来确定要生成的Locale,然后调用上面的工具完成具体生成的过程。Ubuntu上这个工具叫locale-gen,配置文件为/var/lib/locales/supported.d/local。

设定locale

为了新的Locale生效,必须通过环境变量来告诉操作系统,ubuntu下这个配置文件位于/etc/default/locale
文件中可以设定12个LC_*属性,及LC_ALL和LANG两个变量。
优先关系为:LC_ALL>LC_*>LANG
LC_ALL,LANG和LC_*均不指定特定值的话,系统将采用POSIX作为lcoale,也就是C locale。
纯中文系统需要设定LC_ALL= zh_CN.XXXX。
可输入中文的系统,而保持菜单、标题,系统信息等等为英文界面,那么只需要设定LC_CTYPE=zh_CN.XXXX,LANG= en_US.XXXX就可以了。
显示某种文字时只需要取到字符集就可以找字体库显示了,但写某种文字的内容及以某种文字通信时,需要设置操作系统,使它懂这种语言和字符集并根据字符集来将编码后的内容保存到磁盘上。
有兴趣的可以看这篇文章解释系统C代码是如何解析Locale的。

No comments:

Post a Comment