如果你是一个Linux新手,并且刚刚安装了一个新的英文系统但想要设置成中文系统,肯定会接触到上面几个变量,在网上搜索了一系列解决方法,给一些变量赋一下值,再export一下,或者写到配置文件里面,然后就搞定了,但究竟为什么要这样做,可能还是一知半解。通过这两天自己对网上看到的一些文章的整理和自己的试验,在这里记录一下自己的理解。

一、什么是locale

locale这个单词中文翻译成地区或者地域,其实这个单词包含的意义要宽泛很多。Locale是根据计算机用户所使用的语言,所在国家或者地区,以及当地的文化传统所定义的一个软件运行时的语言环境。

上面这个解释摘上网上,说得好玄乎,举两个简单的例子:

a)在“简体中文”的环境,运行df命令,第一行显示的是:

文件系统               1K-块        已用     可用 已用% 挂载点

而在“繁体中文”的环境下,运行df命令,第一行显示的是:

檔案系統               1K-區段      已用     可用 已用% 掛載點

b)在中文环境下运行date命令,显示的是

2013年 01月 27日 星期日 15:57:01 CST

而在英文环境下,运行date命令,显示的是

Sun Jan 27 15:57:46 CST 2013

看到上面两个例子,我想应该比较清楚了,不同地区对一些计算机词汇、日期显示等方面都有各自的习惯,比如中国大陆通常使用“文件系统”,而台湾或者香港地区则会用“檔案系統”,这显然不是简单的从简体到繁体的转换而已,所以可以想像,有一套系统在为各个地区的本地化服务。

locale把按照所涉及到的使用习惯的各个方面分成12个大类,这12个大类分别是:

1、语言符号及其分类(LC_CTYPE)

2、数字(LC_NUMERIC)

3、比较和习惯(LC_COLLATE)

4、时间显示格式(LC_TIME)

5、货币单位(LC_MONETARY)

6、信息主要是提示信息,错误信息,状态信息,标题,标签,按钮和菜单等(LC_MESSAGES)

7、姓名书写方式(LC_NAME)

8、地址书写方式(LC_ADDRESS)

9、电话号码书写方式(LC_TELEPHONE)

10、度量衡表达方式 (LC_MEASUREMENT)

11、默认纸张尺寸大小(LC_PAPER)

12、对locale自身包含信息的概述(LC_IDENTIFICATION)。

而这些信息的配置通常放在/usr/share/i18n/locales目录下,让我们打开一下zh_CN和en_US,看看里面都定义了一些什么东西和有一些什么区别,对比一个比较简单的,LC_TIME有这样的定义

zh_CN:

day    "<U661F><U671F><U65E5>";/

"<U661F><U671F><U4E00>";/

"<U661F><U671F><U4E8C>";/

"<U661F><U671F><U4E09>";/

"<U661F><U671F><U56DB>";/

"<U661F><U671F><U4E94>";/

"<U661F><U671F><U516D>"

mon    "<U4E00><U6708>";"<U4E8C><U6708>";"<U4E09><U6708>";/

"<U56DB><U6708>";"<U4E94><U6708>";"<U516D><U6708>";/

"<U4E03><U6708>";"<U516B><U6708>";"<U4E5D><U6708>";/

"<U5341><U6708>";"<U5341><U4E00><U6708>";"<U5341><U4E8C><U6708>"

en_US:

day    "<U0053><U0075><U006E><U0064><U0061><U0079>";/

"<U004D><U006F><U006E><U0064><U0061><U0079>";/

"<U0054><U0075><U0065><U0073><U0064><U0061><U0079>";/

"<U0057><U0065><U0064><U006E><U0065><U0073><U0064><U0061><U0079>";/

"<U0054><U0068><U0075><U0072><U0073><U0064><U0061><U0079>";/

"<U0046><U0072><U0069><U0064><U0061><U0079>";/

"<U0053><U0061><U0074><U0075><U0072><U0064><U0061><U0079>"

mon    "<U004A><U0061><U006E><U0075><U0061><U0072><U0079>";/

"<U0046><U0065><U0062><U0072><U0075><U0061><U0072><U0079>";/

"<U004D><U0061><U0072><U0063><U0068>";/

"<U0041><U0070><U0072><U0069><U006C>";/

"<U004D><U0061><U0079>";/

"<U004A><U0075><U006E><U0065>";/

"<U004A><U0075><U006C><U0079>";/

"<U0041><U0075><U0067><U0075><U0073><U0074>";/

"<U0053><U0065><U0070><U0074><U0065><U006D><U0062><U0065><U0072>";/

"<U004F><U0063><U0074><U006F><U0062><U0065><U0072>";/

"<U004E><U006F><U0076><U0065><U006D><U0062><U0065><U0072>";/

"<U0044><U0065><U0063><U0065><U006D><U0062><U0065><U0072>"

有人就要问了,<UXXXX>是什么东西,这是Unicode编码的值。这么一说,应该很多人马上就看出来了,上面的“day”就是对“星期”定义,而“mon”就是对“月份”的定义。

所以上面其实是

zh_CN:

day  星期日;

星期一;

...

mon  一月;二月;...

en_US:

day  Sunday;

Monday;

...

mon  January;

February;

...

是的,这就是为什么date命令能够根据不同地区而显示不同内容的原因,都是通过本地化系统配置完成的。

二、如何配置locale

通过locale命令,可以看到LC_*各个变量的设置,如下:

[user~]$ locale

LANG=zh_CN.UTF-8

LC_CTYPE="zh_CN.UTF-8"

LC_NUMERIC="zh_CN.UTF-8"

LC_TIME="zh_CN.UTF-8"

LC_COLLATE="zh_CN.UTF-8"

LC_MONETARY="zh_CN.UTF-8"

LC_MESSAGES="zh_CN.UTF-8"

LC_PAPER="zh_CN.UTF-8"

LC_NAME="zh_CN.UTF-8"

LC_ADDRESS="zh_CN.UTF-8"

LC_TELEPHONE="zh_CN.UTF-8"

LC_MEASUREMENT="zh_CN.UTF-8"

LC_IDENTIFICATION="zh_CN.UTF-8"

LC_ALL=

运行date命令,我们可以看到

[user~]$date

2013年 01月 27日 星期日 17:01:46 CST

下面我们设置LC_TIME变量

[user~]$LC_TIME=en_US.utf8;date

2013年 01月 27日 星期日 17:04:03 CST

咦,怎么还是中文的?是的,不是BUG,你还要将LC_TIME变量export一下,这涉及进程间环境变量的设置问题,这里不多述:

[user~]$ export LC_TIME;date

Sun Jan 27 17:04:33 CST 2013

我们可以看到,将LC_TIME变量设置成en_US之后,date命令的日期的显示改变了

可是我们如果运行ls -al命令的话,却看到

[user~]$ ls -al

总计 0

drwx------ 10 user users 4096 2013-01-01 16:47 .

drwx------ 10 user users 4096 2013-01-01 14:51 ..

这里日期并没有以英文的显示习惯“Jan 1 16:47”显示,这并不奇怪,因为ls命令很可能使用不是LC_TIME变量。

而如果我们设置LC_MESSAGES变量

[user~]$ LC_MESSAGES=en_US.utf8;export LC_MESSAGES;ls -al

total 0

drwx------ 10 user users 4096 2013-01-01 16:47 .

drwx------ 10 user users 4096 2013-01-01 14:51 ..

可以看到,“总计 0” 变成 “total 0” 了。

三、LC_ALL、LANG和LC_*的关系

设定locale就是设定12大类的locale分类属性,即 12个LC_*。除了这12个变量可以设定以外,为了简便起见,还有两个变量: LC_ALL和LANG。它们之间有一个优先级的关系: LC_ALL>LC_*>LANG 可以这么说,LC_ALL是最上级设定或者强制设定,而LANG是默认设定值。

重新打开一个窗口,使得LC_ALL、LANG和LC_*都回到原来的状态,看一下各个变量的默认值。

[user~]$ echo $LANG

zh_CN.utf8

[user~]$ echo $LC_ALL

[user~]$ echo $LC_TIME

可以看到,除了LANG变量是zh_CN.utf8之外,其他的LC_*,包括LC_ALL都是空。可是,我们运行locale命令,却看到

[user~]$ locale

LANG=zh_CN.UTF-8

LC_CTYPE="zh_CN.UTF-8"

LC_NUMERIC="zh_CN.UTF-8"

......

LC_IDENTIFICATION="zh_CN.UTF-8"

LC_ALL=

每个值LC_*值都和LANG的值一样,我们改变一下LANG的值再看一下情况

[user~]$ LANG=en_US.utf8;locale

LANG=en_US.utf8

LC_CTYPE="en_US.utf8"

LC_NUMERIC="en_US.utf8"

......

LC_IDENTIFICATION="en_US.utf8"

LC_ALL=

可以看到LC_*的值随着默认值LANG的变化而变化。而此时,运行date

[user~]$date

Sun Jan 27 17:34:40 CST 2013

再设置LC_ALL的值,看一下结果

[user~]$ LC_ALL=zh_CN.utf8;export LC_ALL;date

2013年 01月 27日 星期日 17:36:24 CST

 可以看到,设置LC_ALL属性之后,原来的en_US.utf8属性已经被重置了,此时再看一下locale命令

[user~]$ locale

LANG=en_US.utf8

LC_CTYPE="zh_CN.utf8"

LC_NUMERIC="zh_CN.utf8"

......

LC_IDENTIFICATION="zh_CN.utf8"

LC_ALL=zh_CN.utf8

从上面的试验可以看到,LANGLC_*的默认值,LC_*变量可以单独设置而可以与LANG不同。而LC_ALLLC_*的优先级别高,设置完LC_ALL之后,会强制重置LC_*各个值,如果不将LC_ALL重新设置为空,则再无法设置LC_*的单个值 

That‘s all~上面就是这两天所得的一些总结,希望对大家有帮助。如果有解释得不对的,欢迎拍砖~

转自:http://www.niba.com/f/1314803a_6771608.html

作者:恋上呼吸的样子

Linux的locale、LC_ALL和LANG的更多相关文章

  1. 【转载】Linux字符集和系统语言设置-LANG,locale,LC_ALL,POSIX等命令及参数详解

    Linux字符集和系统语言设置-LANG,locale,LC_ALL,POSIX等命令及参数详解 1清风揽月10人评论5006人阅读2017-06-21 15:48:43   博文说明[前言]: 本文 ...

  2. 解决 meld 出现 locale.setlocale(locale.LC_ALL,'') 失败的问题

    . . . . . meld 是一款免费的文件比较工具,官网地址:http://meldmerge.org/ 在 Linux 环境使用 meld 的时候,可能会由于语言区域的配置问题导致它无法启动,会 ...

  3. linux下locale中的各环境变量的含义

    本文来自:http://blog.sina.com.cn/s/blog_406127500101dk26.html Locale是软件在运行时的语言环境, 它包括语言(Language), 地域 (T ...

  4. 安装python File "/usr/bin/pip", line 11, in <module> sys.exit(main()) File "/usr/lib/python3.4/site-packages/pip/__init__.py", line 215, in main locale.setlocale(locale.LC_ALL, '') File "/u

      $ uname -a Linux debian 3.16.0-4-amd64 #1 SMP Debian 3.16.7-ckt11-1+deb8u6 (2015-11-09) x86_64 GNU ...

  5. setlocale同mbstowcs函数的关系(VS2008下setlocale(LC_ALL, "chs")可以执行成功,BCB使用setlocale(LC_ALL, "Chinese (Simplified)_People's Republic of China"),linux上locale别名表大概在 /usr/lib/X11/locale/locale.alias)

    序中,如果要将ASCII码字符串转换为宽字符(Unicode),可以利用标准C的mbstowcs函数. 微软在MSDN中有示例,如下: 然而,这段代码在处理含有汉字的字符串时就会出现问题.比如将: w ...

  6. Linux下jetty报java.lang.OutOfMemoryError: PermGen space及Jetty内存配置调优解决方案

    Linux下的jetty报java.lang.OutOfMemoryError: PermGen space及Jetty内存配置调优解决方案问题linux的jetty下发布程序后再启动jetty服务时 ...

  7. setLocale(java.util.Locale), setCharacterEncoding(java.lang.String),setContentType(java.lang.String type)

    对于setCharacterEncoding(java.lang.String),这个方法是javax.servlet.ServletRequest和javax.servlet.ServletResp ...

  8. Linux 下tomcat 出现 java.lang.OutOfMemoryError: unable to create new native thread

    问题现象: Tomcat(8.5.13)部署了SuperMap iServer,并发用户在100左右.系统运行一段时间后,服务崩溃.异常提示 问题分析: 1.看到日志中的提示信息后,认为是系统内存不足 ...

  9. linux环境上报异常java.lang.NoSuchMethodError

    23-Apr-2019 18:11:35.545 INFO [http-nio-10052-exec-10] org.apache.catalina.core.ApplicationContext.l ...

随机推荐

  1. Android Studio配置 AndroidAnnotations——Hi_博客 Android App 开发笔记

    以前用Eclicps 用习惯了现在 想学学 用Android Studio 两天的钻研终于 在我电脑上装了一个Android Studio 并完成了AndroidAnnotations 的配置. An ...

  2. NiceMark——我的Markdown编辑器

    NiceMark--我的Markdown编辑器 闲来无事,写了一个Markdown编辑器.基于electron,完全采用Web前段技术(Html,css,JavaScript)实现.代码已托管在Git ...

  3. 【趣事】用 JavaScript 对抗 DDOS 攻击 (下)

    上一篇:http://www.cnblogs.com/index-html/p/js-network-firewall.html 对抗 v2 之前的那些奇技淫巧,纯属娱乐而已,并不能撑多久. 但简单. ...

  4. 水印第三版 ~ 变态水印(这次用Magick.NET来实现,附需求分析和源码)

    技能 汇总:http://www.cnblogs.com/dunitian/p/4822808.html#skill 以前的水印,只是简单走起,用的是原生态的方法.现在各种变态水印,于是就不再用原生态 ...

  5. Linux下Nodejs安装(完整详细)

    之前安装过windows下以及Mac下的node,感觉还是很方便的,不成想今天安装linux下的坑了老半天,特此记录. 首先去官网下载代码,这里一定要注意安装分两种,一种是Source Code源码, ...

  6. 谈谈一些有趣的CSS题目(八)-- 纯CSS的导航栏Tab切换方案

    开本系列,谈谈一些有趣的 CSS 题目,题目类型天马行空,想到什么说什么,不仅为了拓宽一下解决问题的思路,更涉及一些容易忽视的 CSS 细节. 解题不考虑兼容性,题目天马行空,想到什么说什么,如果解题 ...

  7. spring源码分析之freemarker整合

    FreeMarker是一款模板引擎: 即一种基于模板和要改变的数据, 并用来生成输出文本(HTML网页.电子邮件.配置文件.源代码等)的通用工具. 它不是面向最终用户的,而是一个Java类库,是一款程 ...

  8. C#制作简易屏保

    前言:前段时间,有个网友问我C#制作屏保的问题,我瞬间懵逼了(C#还可以制作屏保!).于是我去查阅相关资料,下面把C#如何制作屏保的过程及我学习过程的心得也记录下来,希望对需要的人能有帮助. 基本思路 ...

  9. Entity Framework 教程——Entity Framework中的实体类型

    Entity Framework中的实体类型 : 在之前的章节中我们介绍过从已有的数据库中创建EDM,它包含数据库中每个表所对应的实体.在EF 5.0/6.0中,存在POCO 实体和动态代理实体两种. ...

  10. if __name__== "__main__" 的意思(作用)python代码复用

    if __name__== "__main__" 的意思(作用)python代码复用 转自:大步's Blog  http://www.dabu.info/if-__-name__ ...