http://www.cnblogs.com/cocowool/archive/2012/07/26/2610713.html 写道
一、为什么要关注locale
我们先从一个bug说起:
* Thu Sep 27 2001 Bernhard Rosenkraenzer 2.5-0.f.2
- Fix up echo A |grep '[A-Z0-9]' in locales other than C
这时在比较老版本的grep中存在的一个问题。这个bug产生的现象如下:
# echo "aA" | grep '[A-Z]$'
aA
# echo "aA" | grep '[a-z]$'
aA
为什么会发生这种情况呢?在正则表达式中,有一种范围表达式,例如:[0-9]表示从0到9的10个数字,[a-d],一般我们会认为表示[abcd]四个字符,但实际上也可能表示[aBbCcDd]这7个字符,这个取决于系统的Locale字符集设置。一般LC_ALL为C时,和我们通常认为的序列一致。参考[3]
这也许是一个很古老的bug,但是却引出了对于locale的思考。
二、locale到底是什么
locale这个单词中文翻译成地区或者地域,其实这个单词包含的意义要宽泛很多。Locale是根据计算机用户所使用的语言,所在国家或者地区,以及当地的文化传统所定义的一个软件运行时的语言环境。
这个用户环境可以按照所涉及到的文化传统的各个方面分成几个大类,通常包括用户所使用的语言符号及其分类(LC_CTYPE),数字(LC_NUMERIC),比较和排序习惯(LC_COLLATE),时间显示格式(LC_TIME),货币单位(LC_MONETARY),信息主要是提示信息,错误信息, 状态信息, 标题, 标签, 按钮和菜单等(LC_MESSAGES),姓名书写方式(LC_NAME),地址书写方式(LC_ADDRESS),电话号码书写方式(LC_TELEPHONE),度量衡表达方式(LC_MEASUREMENT),默认纸张尺寸大小(LC_PAPER)和locale对自身包含信息的概述(LC_IDENTIFICATION)。
所以说,locale就是某一个地域内的人们的语言习惯和文化传统和生活习惯。一个地区的locale就是根据这几大类的习惯定义的,这些locale定义文件放在/usr/share/i18n/locales目录下面,例如en_US, zh_CN and de_DE@euro都是locale的定义文件,这些文件都是用文本格式书写的,你可以用写字板打开,看看里边的内容,当然出了有限的注释以外,大部分东西可能你都看不懂,因为是用的Unicode的字符索引方式。
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)。
另外非常重要的一点就是这些分类是彼此独立的,也就是说LC_CTYPE,LC_COLLATE和 LC_MESSAGES等等分类彼此之间是独立的,可以根据用户的需要设定成不同的值。这一点对很多用户是有利的,甚至是必须的。例如,我就需要一个能够输入中文的英文环境,所以我可以把LC_CTYPE设定成zh_CN.GB18030,而其他所有的项都是en_US.UTF-8。
三、如何设置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。
分享到:
相关推荐
5. **博客示例**: 提到的博客可能详细解释了如何使用这个库,包括如何在项目中集成,以及如何调用API来改变语言。查看博客将有助于理解实际用法。 6. **测试与调试**: 项目可能包含测试用例,用于验证在各种情况下...
根据给定的信息,本文将详细解释如何通过编程方式获取当前计算机上的区域设置,特别是与货币相关的格式信息。此示例采用Visual Basic语言编写,并利用Windows API函数`GetLocaleInfo`来提取所需的数据。 ### 一、`...
本文将对Busybox的配置选项进行详细的解释和分析。 一、General Configuration(通用设置) 在 Busybox 的配置中,General Configuration 是最基本的设置选项,包括了桌面系统和嵌入式系统的设置。在这个部分中,...
下面将详细解释如何在Spring MVC项目中实现i18n,并提供一个Freemarker的小实例。 **1. i18n的概念** i18n代表“国际化”,这里的数字18代表'i'和'n'之间的字母数量。它的目标是设计应用程序,使其能够轻松地适应...
以下是对Java国际化的一些关键知识点的详细解释: 1. **资源束(Resource Bundle)**:在Java国际化中,资源束是存储不同语言版本文本的关键组件。资源束通常包含.properties文件,这些文件按语言代码(如en_US、fr...
以下是对这个主题的详细解释: 一、字符编码的理解 字符编码是将文字与数字对应的方式,例如ASCII码、GB2312、GBK、UTF-8等。在Linux中,最常遇到的是UTF-8编码,它能支持全世界大部分语言,包括中文。然而,如果你...
ws.setEncoding(Locale.CHINA, "GBK"); // 设置编码为GBK,避免中文乱码问题 Workbook workbook = Workbook.createWorkbook(new File("output.xls"), ws); // 创建工作表 Sheet sheet = workbook.createSheet("数据...
Perl是一种高级、通用、解释型、动态的编程语言,Bugzilla就是用Perl编写的。在安装Bugzilla时,为了使其正常运行,需要安装一系列Perl模块。这些模块提供了Bugzilla所需的功能,如数据库连接、HTTP请求处理等。下面...
本文将详细介绍如何在 Delphi 中设置系统的日期格式,并解释代码中的关键部分。 #### 一、基础知识 在深入探讨之前,我们需要了解几个基本概念: 1. **LOCALE_USER_DEFAULT**:这是一个常量,表示当前用户的默认...
API中会解释如何创建和使用这些元素,以实现高质量的视觉效果。 5. **物理系统**:Unity内置了Box2D和Bullet的物理引擎,可以实现物体碰撞、刚体动力学等。API中包含如何设置物理参数,以及如何处理物理事件。 6. ...
以下是对Java程序国际化关键知识点的详细解释: 1. **资源包(Resource Bundle)**:资源包是Java国际化的核心,它存储了特定语言环境下的文本、消息、符号和其他用户界面元素。在Java中,资源包通常是`.properties...
Salesforce ADM201 是 Salesforce Administrator 认证考试的重要组成部分,本资源摘要信息将对考试中的重要概念进行解析,并对每个问题进行详细的解释。 1. 标准 Salesforce.com 个人资料类型 在 Salesforce 中,...
SSH(Secure Shell)是一种网络协议,用于在不安全的网络上提供安全的远程登录和其他服务。在本案例中,"SSH国际化"指的是使SSH服务支持多...如果你能提供`sshch3`文件的具体信息,我可以给出更详细的解释和操作指南。
- I18NInterceptor:解释Struts2中用于处理国际化的拦截器的作用。 - 实现过程讲解:通过实例演示如何在Struts2项目中实现多语言支持。 - 资源文件优先级:讨论不同资源文件之间的优先级关系及其影响。 - **其他...
以下将详细解释如何在不硬编码的情况下,从多个语系的properties文件中检索特定键的资料,并将其存入数据库。 首先,我们需要理解资源bundle的概念。资源bundle是一组按语言和区域设置分组的资源文件,通常以....
下面将详细解释代码中涉及的关键知识点,包括Delphi中的系统时间管理、本地化设置以及如何通过编程方式修改这些设置。 ### Delphi中的系统时间管理 Delphi提供了丰富的API来处理日期和时间数据,其中包括`SysUtils...
这个"JAVA很详细的类库"资源很可能包含了这些类库的详细解释、示例代码以及使用技巧,对于Java学习者来说是一份非常宝贵的资料。通过深入学习和实践,开发者不仅可以掌握Java的基础知识,还能提高解决问题和开发高...
本篇文章将详细探讨Android权限检测的重要性、原理、实现方式及相关的开发实践。 首先,Android权限分为多个等级,包括普通权限(normal permissions)和危险权限(dangerous permissions)。普通权限通常对用户...
以下是对这个主题的详细解释: 1. **Laravel的本地化支持** Laravel提供了强大的本地化(localization)功能,允许开发者为不同地区和语言的用户提供定制的界面文本。通过设置`config/app.php`中的`locale`选项,...