浅谈Linux的locale,LC_ALL和LANG_lc——time-程序员宅基地

技术标签: LC_ALL  linux  locale  LANG  

  如果你是一个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
从上面的试验可以看到,LANG是LC_*的默认值,而LC_ALL比LC_*的优先级别高,设置完LC_ALL之后,会强制重置LC_*各个值,如果不将LC_ALL重新设置为空,则再无法设置LC_*的单个值 。
That‘s all~上面就是这两天所得的一些总结,希望对大家有帮助。如果有解释得不对的,欢迎拍砖~

8. 中文乱码问题
输入命令 v i  /etc/sysconfig/i18n
添加 LANG="zh_CN.UTF-8"
export LC_ALL="zh_CN.GB18030"
保存后重启,意思是断开虚拟机重连。使用default language

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/tongxinhaonan/article/details/64905714

智能推荐

tensorflow使用显卡gpu进行训练详细教程_tensorflow怎么用gpu训练-程序员宅基地

文章浏览阅读3k次,点赞4次,收藏13次。tensorflow使用显卡gpu进行训练详细教程_tensorflow怎么用gpu训练

Tomcat 5.5-Manager App HOW-TO(翻译了部份,努力中...)-程序员宅基地

文章浏览阅读62次。偶也是学习,不过,觉得每次都是读英文,麻烦,就希望把它翻译成中文,为自己,也为其它想学习的朋友,呵呵.不过,由于内容比较多,可能翻译的时间要多一点,如果有兴趣合作的朋友,可以回复BLOG,留言您想翻译那一段.让我们一起完成该内容.不过,为了增加文档的可阅读性,把阅读当成一种享受,请在翻译的时候遵守以下几点:1).翻译的字体一律用绿色.保证阅读不那么伤眼睛.2).重点标题用红色标明,重点内容用蓝色标..._apache manager-howto.html是什么文件

基于Labview与单片机的多通道温度采集系统设计_labview与单片机温度检测系统-程序员宅基地

文章浏览阅读1.2w次,点赞31次,收藏261次。Labview编程跟以往传统的软件编程有很大的不同,最明显的差别就是它是图形化编程。用过Labview的童鞋都知道,整个编程都是拖控件的过程,而不是像传统的软件一样码代码。萝卜青菜各有所爱,Labview也有自己小众Fans。但是小众归小众,在一些信号处理领域,使用Labview编程会大大缩小我们开发的周期。今天,我就来给大家讲讲如何使用Labview的串口来与设备进行通信的。并且在通信的基础上,做了一个四通道的温度采集。按照国际惯例,先来张效果图~~1.首先我们来认识下Labview的串口._labview与单片机温度检测系统

机器视觉图像采集卡的功能与应用-程序员宅基地

文章浏览阅读1.9k次。点击上方“小白学视觉”,选择加"星标"或“置顶”重磅干货,第一时间送达机器视觉技术是目前工业生产检测、医疗检测等领域为实现自动化、智能化而采取的应用。整个机器视觉系统分为图像采集与图像处理..._机器视觉中采集卡的作用

学计算机高中选那三科,高中选课6选3怎么选 选哪几科好-程序员宅基地

文章浏览阅读796次。简单来说,六选三就是考生从思想政治、历史、地理、物理、化学和生物6个科目中自主选择3科作为高考的等级性考试科目。等级考考试成绩将通过等级制等方式折算,计入高考总分。新课改“6选3”该怎么选1.根据大学专业指定学科做出选择:2.根据自身的学习能力选择:含物理组的偏理科科目组合一、推荐组合:物理-化学-历史、物理-生物-历史。这两个组合都是很常见的“物理+历史+其他”组合方式。1、物理-化学-历史这一..._计算机高中选科怎么选择6选3

Netty解决粘包和拆包问题-程序员宅基地

文章浏览阅读46次。2019独角兽企业重金招聘Python工程师标准>>> ..._android netty 过一点时间出现粘包

随便推点

java网络编程Socket中SO_LINGER选项的用法解读_socket.setlinger-程序员宅基地

文章浏览阅读1.3k次。1:设置该选项: public void setSoLinger(boolean on, int seconds) throws SocketException; 读取该选项:public int getSoLinger() throws SocketException SO_LINGER选项用来控制Socket关闭时的行为,默认情况下,执行Socket的close_socket.setlinger

vue.config.js中配置proxy代理https-程序员宅基地

文章浏览阅读5.7k次。一、参考https://www.cnblogs.com/roland-sky/p/12916645.htmlvue.config.js 配置devServer: { // 如果改动node_modules内的代码, 不会触发热重载, 则取消下面的注释 // watchOptions: { // ignored: [] // }, proxy: { '^/api/': { target: 'http://localhost:8060', cha_config.js中配置proxy

计算机网络----TCP如何实现可靠传输(超时重传、滑动窗口、流量控制、拥塞避免)_4.可靠传输的实现;滑动窗口+超时重传-程序员宅基地

文章浏览阅读588次。文章目录以字节为单位的滑动窗口技术如何滑动如何保证可靠重传超时重传流量控制网络拥塞慢开始和拥塞避免算法:(有的版本已经不用了)快重传传输连接管理停止等待协议窗口技术(连续的ARQ协议)累计确认以字节为单位的滑动窗口技术如何滑动接收端发送确认号为7发送端没收到确认不能删发送端收到确认,窗口后移,发送端删除- 副本接收端窗口后移,应用程序读取数据(临时文件)如何保证可靠..._4.可靠传输的实现;滑动窗口+超时重传

【软件工具】linux定时任务写日志_linux 定时任务日志-程序员宅基地

文章浏览阅读1k次,点赞19次,收藏18次。输出的内容仅是脚本或命令产生的标准输出和错误输出。如果你想在日志文件中每次记录时都附带时间戳,你需要在脚本中手动添加时间戳或在命令中嵌入生成时间戳的命令。文件不存在,系统会自动创建它,所以你不需要事先手动创建这个文件。这样的命令,它可以将输出发送到系统日志,并自动包含时间戳。然而,这通常意味着日志信息会进入系统的日志系统中,而不是一个特定的文件。自动在日志文件中添加时间戳需要在脚本执行时就生成时间戳。也就是说,文件在每次脚本执行时都会被重写,只包含最近一次执行的输出。文件的末尾,之前的日志信息不会被覆盖。_linux 定时任务日志

modelsim 10_a 中文注释乱码_multisim10 乱码-程序员宅基地

文章浏览阅读9.4k次。转载于计算机人网:http://computersren.com/material/MaterialDetails.aspx?id=20140307221136&id2=2014030320451027176内容:modelsim 10_a 中文注释乱码modelsim中可以输入汉字,却再打开时为乱码,看来要多写英文的注释了。1.modelsim编辑文件_multisim10 乱码

DDR3和DDR4内存有什么区别?DDR3和DDR4的区别_内存条ddr3和ddr4区别-程序员宅基地

文章浏览阅读5.7k次。在金手指触点数量方面,普通DDR4内存有284个,而DDR3则是240个,每一个触点的间距从1mm缩减到0.85mm,笔记本电脑内存上使用的SO-DIMM DDR4内存有256个触点,SO-DIMM DDR3有204个触点,间距从0.6毫米缩减到了0.5毫米。在中央的高点和两端的低点以平滑曲线过渡。更高频率的DDR4内存在各个方面的表现和DDR3内存相比有着显著的提升,DDR4内存的每个针脚都可以提供2Gbps的带宽,那么DDR4-3200就是51.2GB/s,这比DDR3-1866的带宽提升了70%;_内存条ddr3和ddr4区别

推荐文章

热门文章

相关标签