Linux中locale 详解

举报
资源描述
Linux 中 locale 详解locale 是国际化与本土化过程中的一个非常重要的概念,个人认为,对于中文用户来说,通常会涉及到的国际化或者本土化,大致包含三个方面:看中文,写中文,与 window 中文系统的兼容和通信。从实际经验上看来,locale 的设定与看中文关系不大,但是与写中文,及 window 分区的挂载方式有很密切的关系。本人认为就像一个纯英文的Windows 能够浏览中文,日文或者意大利文网页一样,你不需要设定 locale 就可以看中文。那么,为什么要设定 locale 呢?什么时候会用到 locale 呢?Tags:locale 设定 原因 解释 一、为什么要设定 locale 正如前面我所讲的,设定 locale 与你能否浏览中文的网页没有直接的关系,即便你把 locale 设置成en_US.ISO-8859-1 这样一个标准的英文 locale 你照样可以浏览中文的网页,只要你的系统里面有相应的字符集(这个都不一定需要)和合适的字体(如 simsun),浏览器就可以把网页翻译成中文给你看。具体的过程是网络把网页传送到你的机器上之后,浏览器会判断相应的编码的字符集,根据网页采用的字符集,去字体库里面找合适的字体,然后由文字渲染工具把相应的文字在屏幕上显示出来。在下文本人会偶尔把字符集比喻成密码本,个人觉得对于一些东西比较容易理解,假如你不习惯的话,把全文 copy 到任何文本编辑器,用字符集替换密码本即可。那有时候网页显示乱码或者都是方框是怎么回事呢?个人认为,显示乱码是因为设定的字符集不对(或者没有相应的字符集),例如网页是用UTF-8 编码的,你非要用 GB2312 去看,而系统根据 GB2312 去找字体,然后在屏幕上显示,当然是一堆的乱码,也就是说你用一个错误的密码本去翻译发给你的电报,当然内容那叫一个乱;至于有些时候浏览的网页能显示一部分汉字,但有很多的地方是方框,能够显示汉字说明浏览器已经正确的判断出了网页的编码,并在字体库里面找到了相应的文字,但是并不是每个字体库都包含某个字符集全部的字体的缘故,有些时候会显示不完全,找一个比较全的支持较多字符集的字体就可以了。既然我能够浏览中文网页,那为什么我还要设定 locale呢?其实你有没有想过这么一个问题,为什么gentoo 官方论坛上中文论坛的网页是用 UTF-8 编码的(虽然大家一直强烈建议用 GB2312 编码),但是新浪网就是用 GB2312 编码的呢?而 Xorg 的官方网页竟然是 ISO-8859-15 编码的,我没有设定这个 locale 怎么一样的能浏览呢?这个问题就像是你有所有的密码本,不论某个网站是用什么字符集编码的,你都可以用你手里的密码本把他们翻译过来,但问题是虽然你能浏览中文网页,但是在整个操作系统里面流动的还是英文字符。所以,就像你能听懂英语,也能听懂中文。最根本的问题是:你不可以写中文。当你决定要写什么东西的时候,首先要决定的一件事情是用那种语言,对于计算机来说就是你要是用哪一种字符集,你就必须告诉你的 linux 系统,你想用那一本密码本去写你想要写的东西。知道为什么需要用GB2312 字符集去浏览新浪了吧,因为新浪的网页是用GB2312 写的。为了让你的 Linux 能够输入中文,就需要把系统的 locale 设定成中文的(严格说来是 locale 中的语言类别 LC_CTYPE),例如zh_CN.GB2312、zh_CN.GB18030 或者 zh_CN.UTF-8。很多人都不明白这些古里古怪的表达方式。这个外星表达式规定了什么东西呢?这个问题稍后详述,现在只需要知道,这是locale 的表达方式就可以了。二、到底什么是 locale?locale 这个单词中文翻译成地区或者地域,其实这个单词包含的意义要宽泛很多。Locale 是根据计算机用户所使用的语言,所在国家或者地区,以及当地的文化传统所定义的一个软件运行时的语言环境。这个用户环境可以按照所涉及到的文化传统的各个方面分成几个大类,通常包括用户所使用的语言符号及其分类(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)。所以说,locale 就是某一个地域内的人们的语言习惯和文化传统和生活习惯。一个地区的locale 就是根据这几大类的习惯定义的,这些locale 定义文件放在/usr/share/i18n/locales 目录下面,例如en_US,zh_CN and de_DEeuro 都是locale 的定义文件,这些文件都是用文本格式书写的,你可以用写字板打开,看看里边的内容,当然出了有限的注释以外,大部分东西可能你都看不懂,因为是用的 Unicode 的字符索引方式。对于 de_DEeuro 的一点说明,后边是修正项,也就是说你可以看到两个德国的locale:/usr/share/i18n/locales/de_DEeuro/usr/share/i18n/locales/de_DE 打开这两个 locale 定义,你就会知道它们的差别在于 de_DEeuro 使用的是欧洲的排序、比较和缩进习惯,而 de_DE 用的是德国的标准习惯。上面我们说到了zh_CN.GB18030 的前半部分,后半部分是什么呢?大部分Linux 用户都知道是系统采用的字符集。三、什么是字符集?字符集就是字符,尤其是非英语字符在系统内的编码方式,也就是通常所说的内码,所有的字符集都放在/usr/share/i18n/charmaps,所有的字符集也都是用 Unicode 编号索引的。Unicode 用统一的编号来索引目前已知的全部的符号。而字符集则是这些符号的编码方式,或者说是在网络传输,计算机内部通信的时候,对于不同字符的表达方式,Unicode 是一个静态的概念,字符集是一个动态的概念,是每一个字符传递或传输的具体形式。就像 Unicode 编号U59D0 是代表姐姐的“姐”字,但是具体的这个字是用两个字节表示,三个字节,还是四个字节表示,是字符集的问题。例如:UTF-8 字符集就是目前流行的对字符的编码方式,UTF-8 用一个字节表示常用的拉丁字母,用两个字节表示常用的符号,包括常用的中文字符,用三个表示不常用的字符,用四个字节表示其他的古灵精怪的字符。而 GB2312 字符集就是用两个字节表示所有的字符。需要提到一点的是Unicode 除了用编号索引全部字符以外,本身是用四个字节存储全部字符,这一点在谈到挂载 windows 分区的时候是非常重要的一个概念。所以说你也可以把 Unicode 看作是一种字符集(我不知道它和 UTF-32的关系,反正 UTF-32 就是用四个字节表示所有的字符的),但是这样表述符号是非常浪费资源的,因为在计算机世界绝大部分时候用到的是一个字节就可以搞定的 26 个字母而已。所以才会有 UTF-8,UTF-16 等等,要不然大同世界多好,省了这许多麻烦。四、zh_CN.GB2312 到底是在说什么?Locale 是软件在运行时的语言环境,它包括语言(Language),地域(Territory)和字符集(Codeset)。一个 locale 的书写格式为:语言_地域.字符集.所以说呢,locale 总是和一定的字符集相联系的。下面举几个例子:1、我说中文,身处中华人民共和国,使用国标 2312 字符集来表达字符。zh_CN.GB2312中文_中华人民共和国国标2312字符集。2、我说中文,身处中华人民共和国,使用国标 18030 字符集来表达字符。zh_CN.GB18030中文_中华人民共和国国标 18030 字符集。3、我说中文,身处中华人民共和国台湾省,使用国标 Big5 字符集来表达字符。zh_TW.BIG5=中文_台湾.大五码字符集 4、我说英文,身处大不列颠,使用 ISO-8859-1 字符集来表达字符。en_GB.ISO-8859-1=英文_大不列颠.ISO-8859-1 字符集 5、我说德语,身处德国,使用 UTF-8 字符集,习惯了欧洲风格。de_DE.UTF-8euro德语_德国.UTF-8 字符集按照欧洲习惯加以修正 注意不是emailde_DEeuro.UTF/email-8,所以完全的 locale表达方式是 语言_地域.字符集 修正值 生成的 locale放在/usr/lib/locale/目录中,并且每个 locale 都对应一个文件夹,也就是说创建了emailde_DEeuro.UTF/email-8 locale 之后,就生成/usr/lib/locale/de_DEeuro.UTF-8/目录,里面是具体的每个 locale 的内容。五、怎样去自定义 locale 在 gentoo 生成 locale 还是很容易的,首先要在USE 里面加入 userlocales 支持,然后编辑locales.build文件,这个文件用来指示glibc生成locale文件。很多人不明白每一个条目是什么意思。其实根据上面的说明现在应该很明确了。File:/etc/locales.build en_US/ISO-8859-1en_US.UTF-8/UTF-8 zh_CN/GB18030 zh_CN.GBK/GBKzh_CN.GB2312/GB2312 zh_CN.UTF-8/UTF-8 上面是我的locales.build 文件,依次的说明是这样的:en_US/ISO-8859-1:生成名为 en_US 的 locale,采用ISO-8859-1字符集,并且把这个locale作为英文_美国locale类的默认值,其实它和 en_US.ISO-8859-1/ISO-8859-1 没有任何区别。en_US.UTF-8/UTF-8:生成名为en_US.UTF-8的 locale,采用UTF-8 字符集。zh_CN/GB18030:生成名为 zh_CN 的 locale,采用 GB18030 字符集,并且把这个locale 作为中文_中国 locale 类的默认值,其实它和zh_CN.GB18030/GB18030 没有任何区别。zh_CN.GBK/GBK:生成名为 zh_CN.GBK 的 locale,采用GBK 字符集。zh_CN.GB2312/GB2312:生成名为 zh_CN.GB2312 的 locale,采用 GB2312 字符集。zh_CN.UTF-8/UTF-8:生成名为 zh_CN.UTF-8 的locale,采用UTF-8 字符集。关于默认 locale,默认locale可以简写成 en_US 或者 zh_CN 的形式,只是为了表达简单而已没有特别的意义。Gentoo 在 locale 定义的时候掩盖了一些东西,也就是 locale 的生成工具:localedef。在编译完 glibc 之后你可以用这个 localedef 再补充一些 locale,就会更加理解 locale 了。具体的可以看 localedef 的 manpage。$localedef-f 字符集-i locale 定义文件 生成的 locale 的名称 例如$localedef-f UTF-8-i zh_CN zh_CN.UTF-8 上面的定义方法和在 locales.build 中设定 zh_CN.UTF-8/UTF-8 的结果是一样一样的。六、locale 的五脏六腑 刚刚生成了几个 locale,但是为了让它们生效,必须告诉 Linux 系统使用那(几
展开阅读全文
温馨提示:
金锄头文库所有资源均是用户自行上传分享,仅供网友学习交流,未经上传用户书面授权,请勿作他用。
相关资源
正为您匹配相似的精品文档
相关搜索

当前位置:首页 > 资格认证/考试 > 其它考试类文档


电脑版 |金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号