Linux深入探索16-区域设置:locale

Linux深入探索16-区域设置:locale,第1张

----- 最近更新【2022-02-03】-----

本文目录结构预览:

在 Unix 初期,每个人都使用 ASCII 码,因此也没有什么问题。但是,ASCII 码基于英语,而随着 Unix、Linux 以及 Internet 在世界范围的扩展,有必要设计一种新系统,从而能够处理许多语言以及大量不同的文化习俗。

多年后,开发人员开发出了一种新系统,该系统基于 “区域设置(locale)” 的思想,这属于 POSIX 1003.2 标准。

区域设置是特定于语言和地域的规则和数据的集合,也可以看成是一组环境变量。区域设置包括有关排序规则、日期和时间格式设置、数字和货币约定,以及字符分类的信息。例如,如果 Linux 用户选择了美国英语区域设置,那么在 Linux 中,日期消息将以格式“月-日-年”显示,而货币符号将会使用“$”表示,等。

locale 命令是 Linux 系统中多语言环境的设置接口,用来设置或查看程序运行的不同语言环境。

除 C 和 POSIX 这两个 locale 名称外,locale 的命名规则为: language[_territory[.codeset]][@modifier] ,

即: 语言[_地区[.字符集编码]][@修饰] 。如: en_US.UTF-8

1、语法

locale - 查看区域设置信息。(get locale-specific information)

语法:

常用选项:

注: -c 与 -k 选项后面须带上某个环境变量参数或具体的键名才有意义。如, locale -k LC_CTYPE 。

2、常用案例

使用命令 locale 查看系统中所有区域设置的当前值。

使用命令 locale -a 查看系统支持哪些区域设置。

3、查看区域设置特定变量的值

1)如果 locale 命令后面加上 category 参数,将显示该 category 的所有值。如 locale LC_CTYPE

2)如果 locale 命令后面加上 keyword 参数,将显示该 keyword 对应的值。如 locale charmap

当查看某个具体参数的值时,为了让输出结果更有可读性,一般会加上 -kc 选项。

例:

例:查看有关存储时间和日期的格式。

1、update-locale

update-locale - 修改全局区域设置。(Modify global locale settings)

语法: update-locale [OPTIONS] [var=locale | var] [...]

例:将 LANG 设置为 C.UTF-8

设置完需要重启 shell 才能生效。

2、修改初始化配置文件

也可以通过修改初始化文件来修改区域设置,如修改用户的 .bashrc 文件或 .profile 文件。

如,在初始化文件中添加如下一行:

只是临时修改的话只在命令行执行该命令就行。

3、全局区域设置文件

如果是 Debian 类系统,可以在 /etc/default 中找到全局区域设置文件: /etc/default/locale 。

update-locale 命令修改的就是这个文件的内容。

如果是 Red Hat 类系统,则该文件位于: /etc/locale.conf 。

说明:

优先级: LANG <LC_* <LC_ALL ,优先级比 LANG 高,LC_ALL 优先级最高。

LC_ALL 优先级最高,若设置了此变量,所有 LC_* 和 LANG 都会强制跟随它的值,所以一般不用。 LC_ALL 实际相当于一次设置全部的 LC_* 。

一般我们使用 LANG 来设置全部的 LC_*,而独立设置一个 LC_* 为想要的设置。比如,我设置 LANG=en_US.UTF-8 ,设置 LC_TIME=zh_GN.UTF-8 ,目的是为了输出中文形式的时间。如下:

区域设置可以分为很多个类别(category),也就是多个环境变量。下表将列出一些常用的类别:

使用命 locale 可心展开查看每个 category 的具体键值对:

或者查看某个具体的值:

C 区域设置使用 ASCII 排序序列,在这种排序序列中,大写字母位于小写字母之前:ABC...XYZabc...z。该模式称为 C 排序序列

en_US 区域设置使用一种不同的排序序列,在排序序列中,小写字母和大写字母成对分组:aAbBcC...zZ。这种模式比较自然,因为它以字典顺序组织单词和字符。所以这一模式称为 字典排序序列

排列顺序比较:

例:C 排序序列

例:字典排序序列

    前段时间公司项目导出文件名乱码,经过一番摸索,发现是linux服务器系统编码的锅,看了网上很多帖子,我也有了一些总结(以下出现linux都表示CentOS7)。

    一般来说,如果你的linux系统没人修改过字符集相关配置,那么你是算幸运的。我们中国的项目多数使用utf-8字符集,网上也有说明linux默认字符集是UTF-8,乍一看是统一的,不会乱码,但是实际上,linux默认是"en_US.UTF-8"(至少我的是这样的),而我们需要的实际上不是这个,而是zh_CN.UTF-8,所以我需要把系统字符集修改为"zh_CN.UTF-8"。

修改步骤:

1)直接输入 locale 可查看当前linux系统字符集配置;

观察是否都为"zh_CN.UTF-8"(LC_ALL可以是空的),如若不是,就需要往下走配置了

2)修改 /etc/locale.conf文件;

这个文件的内容不需要多,如果你没有特殊需求(不同功能要求不同字符集编码),仅仅放一行,LANG="zh_CN.UTF-8";然后就可以了,其他文件都不需要动,越动越乱。

3)让locale.conf生效;

使用 source /etc/locale.conf,然后使用 locale 命令查看是否字符集配置修改好。

说明:

第一点:网上有说法修改 i18n 文件,那要看你的目的是什么,我这里,这个文件根本不需要。因为我用的locale.conf,这两个文件有一个就好,我推荐使用locale.conf,centOS7默认没有i18n文件的。使用i18n就自求多福吧!

第二点:不建议对LC_ALL进行配置,确实没必要。如果你主动配置类LC_ALL可能会有很多麻烦事儿等着你。(比方说,有些linux版本,当LANG与LC_ALL配置值相同时,LC_ALL会在/etc/profile.h/lang.sh中被置为空,自己去看lang.sh的内容,就明白了)补充一下,调用文件顺序profile-->lang.sh-->locale.conf

第三点:不建议在profile文件中通过 export LANG="zh_CN.UTF-8"来实现字符集修改(虽然也可以实现),个人感觉这样 *** 作很不舒服。在locale.conf配难道不香吗?(注意差别,差个"export")

第四点:如果你使用shell来连接linux服务器,那你需要当心了。网上有些说法是使用export LANG="zh_CN.UTF-8"命令 或者是export LC_All="zh_CN.UTF-8"来实现字符集修改,我感觉是在骗自己,虽然在当前shell使用locale可以发现修改成功,但当你重新打开一个shell,字符集还是修改之前的。原因百度上有说,linux对每个shell的这种临时配置是隔离的,只对当前shell有效。

第五点:其实上面的修改配置的 步骤3)source命令也是对当前shell的 *** 作,你可以不执行步骤3,直接关闭当前shell,然后重新打开一个shell,你会发现,字符集已经修改好了,之所以要执行source命令是因为①要确定是否配置有误②不想重新打开shell,想在当前shell直接locale看修改结果。

第六点:如果你按照上面的提示修改了locale.conf却发现执行locale的结果始终异常(不是你配置的那种字符集)那说明之前有人在此linux系统作了相关变量的配置,自己慢慢去找吧,按照打开shell的文件加载顺序,或是linux系统启动的文件加载顺序,一个一个去找,应当是对profile之后的某个文件(可能是当前用户的个性化脚本,如~/.bashrc文件等)加了LANG变量或是LC_ALL变量的配置。

(以上仅代表本人粗浅的经验结论,若用不当之处,还望指教)

完(Aronc 20210327)

java locale是什么,让我们一起了解一下?

locale命令是将有关当前语言环境或全部公共语言环境的信息写到标准输出上,如果使用了语言环境类别名而没有使用标志来指定locale命令,那么 locale命令会写出由Name参数指定的语言环境类别中的所有关键字的值。

Java为什么要设定locale?

虽然设定locale与你能否浏览中文的网页没有直接的关系,即便你把locale设置成en_US.ISO-8859-1这样一个标准的英文locale你照样可以浏览中文的网页,只要你的系统里面有相应的字符集(这个都不一定需要)和合适的字体(如simsun),浏览器就可以把网页翻译成中文给你看。具体的过程是网络把网页传送到你的机器上之后,浏览器会判断相应的编码的字符集,根据网页采用的字符集,去字体库里面找合适的字体,然后由文字渲染工具把相应的文字在屏幕上显示出来。 

但是为了让你的Linux能够输入中文,就需要把系统的locale设定成中文的(严格说来是locale中的语言类别LC_CTYPE ),例如zh_CN.GB2312、zh_CN.GB18030或者zh_CN.UTF-8。很多人都不明白这些古里古怪的表达方式。但是只需要知道,这是locale的表达方式就可以了。 

实战 *** 作:

下面通过示例演示在Date中使用Locale的,参考代码如下(LocaleTest.java): import java.util.Locale import java.util.Date import java.util.Calendar import java.text.SimpleDateFormat import java.text.DateFormat /** * Locale 的测试程序 */ public class LocaleTest { public static void main(String[] args) { // 2种不同的Locale的创建方法 testDiffDateLocales() // 显示所有的Locales testAllLocales() } /**   * 2种不同的Locale的创建方法   */ private static void testDiffDateLocales() { // date为2013-09-19 14:22:30 Date date = new Date(113, 8, 19, 14, 22, 30) // 创建“简体中文”的Locale Locale localeCN = Locale.SIMPLIFIED_CHINESE // 创建“英文/美国”的Locale Locale localeUS = new Locale("en", "US") // 获取“简体中文”对应的date字符串 String cn = DateFormat.getDateInstance(DateFormat.MEDIUM, localeCN).format(date) // 获取“英文/美国”对应的date字符串 String us = DateFormat.getDateInstance(DateFormat.MEDIUM, localeUS).format(date) System.out.printf("cn=%s\nus=%s\n", cn, us) } /**   * 显示所有的Locales   */ private static void testAllLocales() { Locale[] ls = Locale.getAvailableLocales() System.out.print("All Locales: ") for (Locale locale:ls) { System.out.printf(locale+", ") } System.out.println() } }


欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/tougao/11229838.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-05-14
下一篇 2023-05-14

发表评论

登录后才能评论

评论列表(0条)

保存