鼓捣一下Linux下的locale

简介: 关于Linux下的locale,网上讲这个资料不少,本没必要多说什么。无奈手贱,权当做个笔记吧。以下操作环境为CentOS 6.5 1. 查看当前locale [chenhj@node1 ~]$ locale LANG=en_US.
关于Linux下的locale,网上讲这个资料不少,本没必要多说什么。无奈手贱,权当做个笔记吧。以下操作环境为CentOS 6.5

1. 查看当前locale


  1. [chenhj@node1 ~]$ locale
  2. LANG=en_US.UTF-8
  3. LC_CTYPE="zh_CN.UTF8"
  4. LC_NUMERIC="zh_CN.UTF8"
  5. LC_TIME="zh_CN.UTF8"
  6. LC_COLLATE="zh_CN.UTF8"
  7. LC_MONETARY="zh_CN.UTF8"
  8. LC_MESSAGES="zh_CN.UTF8"
  9. LC_PAPER="zh_CN.UTF8"
  10. LC_NAME="zh_CN.UTF8"
  11. LC_ADDRESS="zh_CN.UTF8"
  12. LC_TELEPHONE="zh_CN.UTF8"
  13. LC_MEASUREMENT="zh_CN.UTF8"
  14. LC_IDENTIFICATION="zh_CN.UTF8"
  15. LC_ALL=zh_CN.UTF8
上面列出了系统支持各种区域相关的属性,比如日期,货币。


2. 设置locale

通过设置环境变量可以随时改变locale
LC_ALL > LC_* > LANG
[root@node1 ~]# export LC_ALL=zh_CN.utf8

或者修改/etc/sysconfig/i18n

  1. [root@node1 ~]# cat /etc/sysconfig/i18n
  2. LANG="en_US.UTF-8"
  3. SYSFONT="latarcyrheb-sun16"

3.查看系统支持的loacle一览

比如列出所有zh_CN的

  1. [chenhj@node1 ~]$ locale -a|grep zh_CN
  2. zh_CN
  3. zh_CN.gb18030
  4. zh_CN.gb2312
  5. zh_CN.gbk
  6. zh_CN.utf8

4. locale的定义在哪里?

/usr/share/i18n/locales目录比如zh_CN
/usr/share/i18n/locales/zh_CN:

  1. ...
  2. LC_CTYPE
  3. % This is a copy of the "i18n" LC_CTYPE with the following modifications:
  4. % - Additional classes: hanzi

  5. copy "i18n"

  6. translit_start
  7. include "translit_combining";""
  8. translit_end

  9. class "hanzi"; /
  10. % U3400>..U4DBF>;/
  11.         U4E00>..U9FA5>;/
  12.         UF92C>;UF979>;UF995>;UF9E7>;UF9F1>;UFA0C>;UFA0D>;UFA0E>;/
  13.         UFA0F>;UFA11>;UFA13>;UFA14>;UFA18>;UFA1F>;UFA20>;UFA21>;/
  14.         UFA23>;UFA24>;UFA27>;UFA28>;UFA29>
  15. END LC_CTYPE

  16. % ISO 14651 collation sequence
  17. LC_COLLATE
  18. copy "iso14651_t1_pinyin"
  19. END LC_COLLATE
  20. ...

上面的LC_CTYPE定义了简体中文的汉字分类"hanzi",LC_COLLATE定义了汉字的拼音排序。


还可以再打开拼音排序的定义文件看看
/usr/share/i18n/locales/iso14651_t1_pinyin

  1. LC_COLLATE

  2. copy "iso14651_t1_common"

  3. script HAN>

  4. order_start HAN>;forward;forward;forward;forward,position
  5. U5416> U5416>;IGNORE;IGNORE;IGNORE #吖104
  6. U814C> U814C>;IGNORE;IGNORE;IGNORE #腌185
  7. U9312> U9312>;IGNORE;IGNORE;IGNORE #錒0
  8. U9515> U9515>;IGNORE;IGNORE;IGNORE #锕7
  9. U963F> U963F>;IGNORE;IGNORE;IGNORE #阿23237
  10. U55C4> U55C4>;IGNORE;IGNORE;IGNORE #嗄60
  11. U554A> U554A>;IGNORE;IGNORE;IGNORE #啊16566
  12. U54C0> U54C0>;IGNORE;IGNORE;IGNORE #哀4070
  13. U54CE> U54CE>;IGNORE;IGNORE;IGNORE #哎2473
  14. ...

一看注释就明白了,确实是按拼音排序的。

5 字符集在哪定义的?

字符集都定义在/usr/share/i18n/charmaps目录下,比如GB2312。
/usr/share/i18n/charmaps/GB2312.gz

  1. code_set_name> GB2312
  2. mb_cur_max> 2
  3. mb_cur_min> 1
  4. comment_char> %
  5. escape_char> /
  6. % Chinese charmap for EUC-CN = GB2312 = union of ASCII and GB_2312-80
  7. % version: 1.0
  8. % Contact: ha_shao
  9. % Email: hashao@china.com
  10. % Distribution and use is free, even for comercial purpose.
  11. %
  12. CHARMAP
  13. U0000> /x00 NULL (NUL)
  14. U0001> /x01 START OF HEADING (SOH)
  15. U0002> /x02 START OF TEXT (STX)
  16. U0003> /x03 END OF TEXT (ETX)
  17. U0004> /x04 END OF TRANSMISSION (EOT)
  18. U0005> /x05 ENQUIRY (ENQ)
  19. U0006> /x06 ACKNOWLEDGE (ACK)
  20. U0007> /x07 BELL (BEL)
  21. U0008> /x08 BACKSPACE (BS)
  22. U0009> /x09 CHARACTER TABULATION (HT)
  23. ...



6. 创建loacle

前面提到的loacle定义和字符集定义相当于源代码,我们真正使用是基于loacle定义+字符集定义的得到的编译好的locale。创建loacle使用localedef
man localedef

  1. ...
  2. The localedef program reads the indicated charmap and input files, compiles them to a form usable by the locale(7) functions inthe C library, and places the six output files in the outputpath directory.
  3. ...

定义一个试试!

  1. [root@node1 ~]# localedef -f UTF-8 -i zh_CN myzh
  2. [root@node1 ~]# locale -a|grep myzh
    myzh
    myzh.utf8
创建的locale被添加进了/usr/lib/locale/locale-archive

  1. [root@node1 ~]# grep myzh /usr/lib/locale/locale-archive
  2. Binary file /usr/lib/locale/locale-archive matches

7. 获取本地化消息


  1. [root@node1 ~]# export LC_ALL=myzh.utf8
  2. [root@node1 ~]# ls xx
  3. ls: cannot access xx: No such file or directory

怎么还是英文消息?
看看它在干嘛!

  1. [root@node1 ~]# strace -eopen ls xx
  2. open("/etc/ld.so.cache", O_RDONLY) = 3
  3. open("/lib64/libselinux.so.1", O_RDONLY) = 3
  4. open("/lib64/librt.so.1", O_RDONLY) = 3
  5. open("/lib64/libcap.so.2", O_RDONLY) = 3
  6. open("/lib64/libacl.so.1", O_RDONLY) = 3
  7. open("/lib64/libc.so.6", O_RDONLY) = 3
  8. open("/lib64/libdl.so.2", O_RDONLY) = 3
  9. open("/lib64/libpthread.so.0", O_RDONLY) = 3
  10. open("/lib64/libattr.so.1", O_RDONLY) = 3
  11. open("/proc/filesystems", O_RDONLY) = 3
  12. open("/usr/lib/locale/locale-archive", O_RDONLY) = 3
  13. open("/usr/share/locale/locale.alias", O_RDONLY) = 3
  14. open("/usr/share/locale/myzh.utf8/LC_MESSAGES/coreutils.mo", O_RDONLY) = -1 ENOENT (No such file or directory)
  15. open("/usr/share/locale/myzh/LC_MESSAGES/coreutils.mo", O_RDONLY) = -1 ENOENT (No such file or directory)
  16. ls: cannot access xxopen("/usr/share/locale/myzh.utf8/LC_MESSAGES/libc.mo", O_RDONLY) = -1 ENOENT (No such file or directory)
  17. open("/usr/share/locale/myzh/LC_MESSAGES/libc.mo", O_RDONLY) = -1 ENOENT (No such file or directory)
  18. : No such file or directory
原来找不到 libc的本地消息资源文件。localedef只是定义了locale的基本内容,每个应用要使用的本地资源还得另外加。
现在从别的地方 借个过来应急!

  1. [root@node1 ~]# ls /usr/share/locale/myzh
    ls: cannot access /usr/share/locale/myzh: No such file or directory
  2. [root@node1 ~]# ln -sf /usr/share/locale/zh_CN /usr/share/locale/myzh

再试一下,OK了。

  1. [root@node1 ~]# ls xx
  2. ls: 无法访问xx: 没有那个文件或目录

最后把这个临时的locale删掉

  1. [root@node1 ~]# localedef --delete-from-archive myzh
  2. [root@node1 ~]# rm -f /usr/share/locale/myzh

8 参考

http://wiki.ubuntu.org.cn/Locale
http://www.linuxidc.com/Linux/2009-12/23620.htm
http://sysadmin.blog.51cto.com/83876/223870




相关文章
|
JavaScript Linux
【Azure App Service for Linux】NodeJS镜像应用启动失败,遇见 RangeError: Incorrect locale information provided
【Azure App Service for Linux】NodeJS镜像应用启动失败,遇见 RangeError: Incorrect locale information provided
246 0
|
Linux
LINUX系统编程 LINUX地区(locale)设置
LINUX本地的locale设置使用/etc/sysconfig/i18n进行设置, 这里的i18n是术语internationalization的缩写i加上18字符 在加上n,这样更为方便,同时区一样LINUX地区系统维护在 /usr/share/locale...
1731 0
|
17天前
|
Unix Linux 程序员
Linux文本搜索工具grep命令使用指南
以上就是对Linux环境下强大工具 `grep` 的基础到进阶功能介绍。它不仅能够执行简单文字查询任务还能够处理复杂文字处理任务,并且支持强大而灵活地正则表达规范来增加查询精度与效率。无论您是程序员、数据分析师还是系统管理员,在日常工作中熟练运用该命令都将极大提升您处理和分析数据效率。
80 16
|
9天前
|
Linux
linux命令—stat
`stat` 是 Linux 系统中用于查看文件或文件系统详细状态信息的命令。相比 `ls -l`,它提供更全面的信息,包括文件大小、权限、所有者、时间戳(最后访问、修改、状态变更时间)、inode 号、设备信息等。其常用选项包括 `-f` 查看文件系统状态、`-t` 以简洁格式输出、`-L` 跟踪符号链接,以及 `-c` 或 `--format` 自定义输出格式。通过这些选项,用户可以灵活获取所需信息,适用于系统调试、权限检查、磁盘管理等场景。
|
2月前
|
监控 Linux 网络安全
Linux命令大全:从入门到精通
日常使用的linux命令整理
653 13
|
3月前
|
Linux 网络安全 数据安全/隐私保护
使用Linux系统的mount命令挂载远程服务器的文件夹。
如此一来,你就完成了一次从你的Linux发车站到远程服务器文件夹的有趣旅行。在这个技术之旅中,你既探索了新地方,也学到了如何桥接不同系统之间的距离。
522 21
|
3月前
|
JSON 自然语言处理 Linux
linux命令—tree
tree是一款强大的Linux命令行工具,用于以树状结构递归展示目录和文件,直观呈现层级关系。支持多种功能,如过滤、排序、权限显示及格式化输出等。安装方法因系统而异常用场景包括:基础用法(显示当前或指定目录结构)、核心参数应用(如层级控制-L、隐藏文件显示-a、完整路径输出-f)以及进阶操作(如磁盘空间分析--du、结合grep过滤内容、生成JSON格式列表-J等)。此外,还可生成网站目录结构图并导出为HTML文件。注意事项:使用Tab键补全路径避免错误;超大目录建议限制遍历层数;脚本中推荐禁用统计信息以优化性能。更多详情可查阅手册mantree。
linux命令—tree
|
1月前
|
Linux 网络安全 开发工具
技术栈:这50条最常用的 Linux 命令你一定要会!
建议多在终端中实践,遇到不懂的命令就用 man 或 --help 了解详情!
373 0
|
1月前
|
安全 Linux Shell
Linux系统中sudo命令的高效运用技巧。
用户可以通过sudo -l来列出自己目前可执行的命令列表,这有助于用户了解自己的权限范围。
112 0