来自:zip11 > 馆藏分类
配色: 字号:
Linux设置locale中文显示
2018-01-31 | 阅:  转:  |  分享 
  
如果你是一个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????"65E5>";/?"";/?"";/?"61F>";/?"";/?"4E94>";/?""mon????"";"<
U6708>";"";/?"";"";"16D>";/?"";"";""
;/?"";"";">"en_US:?day????"";/?"<
U004D>";/?"5>";/?"0065>";/?">";/?"061>";/?"
"mon????"
";/?"";/?
"";/?"069>";/?"";/?"0065>";/?"";/?"<
U0075>";/?"D>";/?"0065>";/?">";/?"072>"?有人就要问了,是什么东西,这是Unicode编码的值。这么一说,应该很多人马上就看出来了,上面的“day
”就是对“星期”定义,而“mon”就是对“月份”的定义。所以上面其实是zh_CN:day??星期日;?星期一;?...mon??一
月;二月;...en_US:day??Sunday;?Monday;?...mon??January;?February;?...
?是的,这就是为什么date命令能够根据不同地区而显示不同内容的原因,都是通过本地化系统配置完成的。二、如何配置locale?通过
locale命令,可以看到LC_各个变量的设置,如下:[user~]$?localeLANG=zh_CN.UTF-8LC_CTY
PE="zh_CN.UTF-8"LC_NUMERIC="zh_CN.UTF-8"LC_TIME="zh_CN.UTF-8"LC_C
OLLATE="zh_CN.UTF-8"LC_MONETARY="zh_CN.UTF-8"LC_MESSAGES="zh_CN.U
TF-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_I
DENTIFICATION="zh_CN.UTF-8"LC_ALL=运行date命令,我们可以看到[user~]$date2013
年?01月?27日?星期日?17:01:46?CST下面我们设置LC_TIME变量[user~]$LC_TIME=en_US.ut
f8;date2013年?01月?27日?星期日?17:04:03?CST咦,怎么还是中文的?是的,不是BUG,你还要将LC_TI
ME变量export一下,这涉及进程间环境变量的设置问题,这里不多述:[user~]$?export?LC_TIME;dateSu
n?Jan?27?17:04:33?CST?2013我们可以看到,将LC_TIME变量设置成en_US之后,date命令的日期的显
示改变了可是我们如果运行ls?-al命令的话,却看到[user~]$?ls?-al总计?0drwx------?10?user?u
sers?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?-altotal?0drwx------?10?user?users?4096?2013-01-0
1?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?$LANGz
h_CN.utf8[user~]$?echo?$LC_ALL[user~]$?echo?$LC_TIME?可以看到,除了LANG变
量是zh_CN.utf8之外,其他的LC_,包括LC_ALL都是空。可是,我们运行locale命令,却看到[user~]$?lo
caleLANG=zh_CN.UTF-8LC_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;localeLANG=en_US.utf8L
C_CTYPE="en_US.utf8"LC_NUMERIC="en_US.utf8"......LC_IDENTIFICATIO
N="en_US.utf8"LC_ALL=?可以看到LC_的值随着默认值LANG的变化而变化。而此时,运行date[user~]
$dateSun?Jan?27?17:34:40?CST?2013?再设置LC_ALL的值,看一下结果[user~]$?LC_AL
L=zh_CN.utf8;export?LC_ALL;date2013年?01月?27日?星期日?17:36:24?CST?可以看
到,设置LC_ALL属性之后,原来的en_US.utf8属性已经被重置了,此时再看一下locale命令[user~]$?localeLANG=en_US.utf8LC_CTYPE="zh_CN.utf8"LC_NUMERIC="zh_CN.utf8"......LC_IDENTIFICATION="zh_CN.utf8"LC_ALL=zh_CN.utf8?从上面的试验可以看到,LANG是LC_的默认值,而LC_ALL比LC_的优先级别高,设置完LC_ALL之后,会强制重置LC_各个值,如果不将LC_ALL重新设置为空,则再无法设置LC_的单个值?。?That''s?all~上面就是这两天所得的一些总结,希望对大家有帮助。如果有解释得不对的,欢迎拍砖~—1—
献花(0)
+1
(本文系zip11首藏)