java环境变量locale_locale的设定及其LANG、LC_ALL、
LANGUAG。。。
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是根据计算机⽤户所使⽤的语⾔,所在国家或者地区,以及当地的⽂化传统所定义的⼀个软件运⾏时的语⾔环境。
[oracle@game ~]$ locale
LANG=en_US.UTF-8
LC_CTYPE="en_US.UTF-8"
LC_NUMERIC="en_US.UTF-8"
LC_TIME="en_US.UTF-8"
LC_COLLATE="en_US.UTF-8"
LC_MONETARY="en_US.UTF-8"
LC_MESSAGES="en_US.UTF-8"
LC_PAPER="en_US.UTF-8"
LC_NAME="en_US.UTF-8"
LC_ADDRESS="en_US.UTF-8"
LC_TELEPHONE="en_US.UTF-8"
LC_MEASUREMENT="en_US.UTF-8"
LC_IDENTIFICATION="en_US.UTF-8"
LC_ALL=en_US.UTF-8
[oracle@game ~]$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)。
所以说,locale就是某⼀个地域内的⼈们的语⾔习惯和⽂化传统和⽣活习惯。⼀个地区的locale就是根据这⼏⼤类的习惯定义的,这些locale定义⽂件放在/usr/share/i18n/locales⽬录下⾯,例如en_US, zh_CN and de_DE@euro都是locale的定义⽂件,这些⽂件都是⽤⽂本格式书写的,你可以⽤写字板打开,看看⾥边的内容,当然出了有限的注释以外,⼤部分东西可能你都看不懂,因为是⽤的Unicode的字符索引⽅式。
[oracle@game ~]$ cd /usr/share/i18n/locales
[oracle@game locales]$ ls
aa_DJ ar_YE el_GR es_ES fr_CH iso14651_t1 ne_NP so_ET translit_hangul
aa_ER az_AZ el_GR@euro es_ES@euro fr_FR it_CH nl_BE so_KE translit_narrow
aa_ER@saaho be_BY en_AU es_GT fr_FR@euro it_IT nl_BE@euro so_SO translit_neutral
aa_ET bg_BG en_BW es_HN fr_LU it_IT@euro nl_NL sq_AL translit_small
af_ZA bn_BD en_CA es_MX fr_LU@euro iw_IL nl_NL@euro sr_CS translit_wide
am_ET bn_IN en_DK es_NI ga_IE ja_JP nn_NO st_ZA tr_TR
an_ES br_FR en_GB es_PA ga_IE@euro ka_GE no_NO sv_FI tt_RU
ar_AE br_FR@euro en_HK es_PE gd_GB kk_KZ oc_FR sv_FI@euro uk_UA
ar_BH bs_BA en_IE es_PR gez_ER kl_GL om_ET sv_SE ur_PK
ar_DZ byn_ER en_IE@euro es_PY gez_ER@abegede kn_IN om_KE ta_IN uz_UZ
ar_EG ca_ES en_IN es_SV gez_ET ko_KR pa_IN te_IN uz_UZ@cyrillic
ar_IN ca_ES@euro en_NZ es_US gez_ET@abegede kw_GB pl_PL tg_TJ vi_VN
ar_IQ cs_CZ en_PH es_UY gl_ES lg_UG POSIX th_TH wa_BE
ar_JO cy_GB en_SG es_VE gl_ES@euro lo_LA pt_BR ti_ER wa_BE@euro
ar_KW da_DK en_US et_EE gu_IN lt_LT pt_PT ti_ET wal_ET
ar_LB de_AT en_ZA eu_ES gv_GB lv_LV pt_PT@euro tig_ER xh_ZA
ar_LY de_AT@euro en_ZW eu_ES@euro he_IL mi_NZ ro_RO tl_PH yi_US
ar_MA de_BE es_AR fa_IR hi_IN mk_MK ru_RU translit_circle zh_CN
ar_OM de_BE@euro es_BO fi_FI hr_HR ml_IN ru_UA translit_cjk_compat zh_HK
ar_QA de_CH es_CL fi_FI@euro hu_HU mn_MN se_NO translit_cjk_variants zh_SG
ar_SA de_DE es_CO fo_FO hy_AM mr_IN sid_ET translit_combining zh_TW
ar_SD de_DE@euro es_CR fr_BE i18n ms_MY sk_SK translit_compat zu_ZA
ar_SY de_LU es_DO fr_BE@euro id_ID mt_MT sl_SI translit_font
ar_TN de_LU@euro es_EC fr_CA is_IS nb_NO so_DJ translit_fraction
[oracle@game locales]$
对于de_DE@euro的⼀点说明,@后边是修正项,也就是说你可以看到两个德国的locale:/usr/share/i18n/locales /de_DE@euro
和/usr/share/i18n/locales/de_DE。打开这两个locale定义,你就会知道它们的差别在于 de_DE@euro使⽤的是欧洲的排序、⽐较和缩进习惯,⽽de_DE⽤的是德国的标准习惯。
java环境变量自动配置上⾯我们说到了zh_CN.GB18030的前半部分,后半部分是什么呢?⼤部分Linux⽤户都知道是系统采⽤的字符集。
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-8@euro=德语_德国.UTF-8字符集@按照欧洲习惯加以修正,注意不是de_DE@euro.UTF-8,所以完全的locale表达⽅式是 [语⾔[_地域][.字符集] [@修正值]。其中,与中⽂输⼊关系最密切的就是LC_CTYPE,LC_CTYPE规定了系统内有效的字符以及这些字符的分类,诸如什么是⼤写字母,⼩写字母,⼤⼩写转换,标点符号、可打印字符和其他的字符属性等⽅⾯。⽽locale定义zh_CN中最最重要的⼀项就是定义了汉字(Class“hanzi”)这⼀个⼤类,当然也是⽤Unicode描述的,这就让中⽂字符在Linux系统中成为合法的有效字符,⽽且不论它们是⽤什么字符集编码的。怎样设定locale呢?
设定locale就是设定12⼤类的locale分类属性,即12个LC_*。除了这12个变量可以设定以外,为了简便起见,还有两个变量:LC_ALL和LANG。它们之间有⼀个优先级的关系:LC_ALL > LC_* >LANG。可以这么说,LC_ALL是最上级设定或者强制设定,⽽LANG是默认设定值。
1、如果你设定了LC_ALL=zh_CN.UTF-8,那么不管LC_*和LANG设定成什么值,它们都会被强制服从LC_ALL的设定,成为
zh_CN.UTF-8。
2、假如你设定了LANG=zh_CN.UTF-8,⽽其他的LC_*=en_US.UTF-8,并且没有设定LC_ALL的话,那么系统的locale设定以
LC_*=en_US.UTF-8。
3、假如你设定了LANG=zh_CN.UTF-8,⽽其他的LC_*,和LC_ALL均未设定的话,系统会将LC_*设定成默认值,也就是LANG的值
zh_CN.UTF-8。
4、假如你设定了LANG=zh_CN.UTF-8,⽽其他的LC_CTYPE=en_US.UTF-8,其他的LC_*,和LC_ALL均未设定的话,那么系统的locale设定将是:LC_CTYPE=en_US.UTF-8,其余的 LC_COLLATE,LC_MESSAGES等等均会采⽤默认值,也就是 LANG的值,也就是LC_COLLATE=LC_MESSAGES=……= LC_PAPER=LANG=zh_CN.UTF-8。
所以,locale是这样设定的:
1、如果你需要⼀个纯中⽂的系统的话,设定LC_ALL= zh_CN.XXXX,或者LANG=zh_CN.XXXX都可以,当然你可以两个都设定,但正如上⾯所讲,LC_ALL的值将覆盖所有其他的locale设定,不要作⽆⽤功。
2、如果你只想要⼀个可以输⼊中⽂的环境,⽽保持菜单、标题,系统信息等等为英⽂界⾯,那么只需要设定 LC_CTYPE=
zh_CN.XXXX,LANG=en_US.XXXX就可以了。这样LC_CTYPE=zh_CN.XXXX,⽽LC_COLLATE=LC_MESSAGES=……=
LC_PAPER=LANG=en_US.XXXX。
3、假如你⾼兴的话,可以把12个LC_*⼀⼀设定成你需要的值,打造⼀个古灵精怪的系统: LC_CTYPE=zh_CN.GBK/GBK(使⽤中⽂编码内码GBK字符集); LC_NUMERIC=en_GB.ISO-8859-1(使⽤⼤不列颠的数字系统) LC_MEASUREMEN=de_DE@euro.ISO-8859-15(德国的度量衡使⽤ISO-8859-15字符集) 罗马的地址书写⽅式,美国的纸张设定……。估计没⼈这么⼲吧。
4、假如你什么也不做的话,也就是LC_ALL,LANG和LC_*均不指定特定值的话,系统将采⽤POSIX作为lcoale,也就是C locale。
另外LANG和LANGUAGE有什么区别呢?
LANG - Specifies the default locale for all unset locale variables
LANGUAGE - Most programs use this for the language of its interface
LANGUAGE是设置应⽤程序的界⾯语⾔。⽽LANG是优先级很低的⼀个变量,它指定所有与locale有关的变量的默认值,
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论