我应该将我的语言环境设置为什么以及这样做的含义是什么?

Fah*_*tha 23 locale

这个问题是通过询问Chromium 浏览器不允许为“打印到文件”设置默认纸张大小的问题 以及在聊天中与@Gilles 进行对话而激发的。正如@don_crissti 所指出的,并经我证实,更改语言环境(至少LC_PAPER)会影响选择的纸张尺寸。

我从来没有想过要选择什么,而且总是选择,en_US.UTF-8因为这似乎是一个合理的默认选择。

但是,根据聊天中的@Gilles(请参阅从http://chat.stackexchange.com/transcript/message/17017095#17017095开始的对话)。摘录:

吉尔斯:LC_PAPER 默认为 $LANG

吉尔斯:你必须有 LANG=en_US.UTF-8。这是一个坏主意:它设置了 LC_COLLATE 而这几乎总是一件坏事

Gilles:LC_COLLATE 没有描述正确的排序规则,它太严格了(它逐个字符)删除 LANG 而是设置 LC_CTYPE 和 LC_PAPER

Gilles:加上 LC_MESSAGES 如果你想要非英语的消息

显然,这里有一些我不知道的问题,我相信还有很多其他问题。那么,在设置语言环境时应该考虑哪些问题,又应该如何设置呢?我一直只是dpkg-reconfigure locales在 Debian 中运行,并没有三思而后行。

具体问题:我应该将语言环境设置为 en_IN.UTF-8 吗?这样做有什么缺点吗?

另请参阅:LC_COLLATE 是否(应该)影响字符范围?

Gil*_*il' 35

区域设置是与您的文化相关的用户首选项。

语言环境名称

在我知道的所有当前 unix 变体上(但不是在一些古董上),语言环境名称遵循相同的模式:

  • 一个ISO 639-1小写的两字母语言代码,或ISO 639-2如果语言没有两字母代码三字母语言代码。例如,en对于英语,de对于德语,ja对于日语,uk对于乌克兰语,ber对于柏柏尔语,......
  • 对于许多但不是所有语言,下划线_后跟ISO 3166大写的两个字母的国家/地区代码。因此:en_US对于美国英语、en_UK对于英国英语、对于fr_CA加拿大(魁北克)法语、de_DE对于德国的德语、de_AT对于奥地利的德语、ja_JP对于日语(日本的)等。
  • 或者,一个点.后跟一个名称的字符编码,例如UTF-8ISO-8859-1KOI8-UGB2312Big5,等有了GNU libc中至少(我不知道如何广泛,这是),外壳和标点编码名称被忽略。例如,zh_CN.UTF-8普通话(简体)中文用UTF-8zh_CN编码,普通话用GB2312编码,zh_TW台湾(繁体)中文用Big5编码。
  • 可选地,一个 at 符号@后跟一个变体的名称。变体的含义取决于语言环境。例如,许多欧洲国家/地区都有一种@euro语言环境变体,其中货币符号为 € 并且编码为包含此字符的编码(ISO 8859-15 或 ISO 8859-16),而不是带有旧货币符号的未修饰变体。例如,en_IE(English, Ireland) 使用 latin1 (ISO 8859-1) 编码和 £ 作为货币符号,而en_IE@euro使用 latin9 (ISO 8859-15) 编码和 € 作为货币符号。

此外,所有类 Unix 系统上都存在两个语言环境名称:CPOSIX. 这些名称是同义词,意思是计算机术语,即适用于由计算机程序解析的数据的默认设置。

区域设置

POSIX定义了以下语言环境类别:

  • LC_CTYPE:终端应用使用的字符集:分类数据(哪些字符是字母、标点、空格、无效等)和大小写转换。文本实用程序通常会注意LC_CTYPE确定字符边界。
  • LC_COLLATE:整理(即排序)顺序。由于以下几个原因,此设置的用途非常有限:
    • 大多数语言都有复杂的规则,这些规则取决于排序的内容(例如,字典单词和专有名称可能不会使用相同的顺序)并且不能用LC_COLLATE.
    • 很少有应用程序需要使用区域设置的软件执行正确的排序顺序。例如,文字处理器将文件的语言和编码存储在文件本身中(否则文件将无法在具有不同区域设置的系统上正确处理)并且不关心环境指定的区域设置。
    • LC_COLLATE可能会产生令人讨厌的副作用,特别是因为它会导致排序顺序 A < a < B < ...,这使得“在 A 和 Z 之间”包括小写字母 a 到 y。特别是非常常见的正则表达式,例如[A-Z]break some applications
  • LC_MESSAGES:信息和错误消息的语言。
  • LC_NUMERIC: 数字格式:十进制和千位分隔符。
    许多应用程序硬编码.为小数点分隔符。这使得LC_NUMERIC不是很有用并且有潜在危险:
    • 即使您设置了它,您仍然会经常看到默认格式。
    • 您可能会遇到这样一种情况:一个应用程序生成依赖于语言环境的输出,而另一个应用程序需要.小数点或,字段分隔符。
  • LC_MONETARY: 像LC_NUMERIC,但适用于当地货币的数量。
    很少有应用程序使用它。
  • LC_TIME: 日期和时间格式:工作日和月份名称、12 或 24 小时制、日期部分的顺序、标点符号等。

您可以在非嵌入式 Linux 上找到 GNU libc,它定义了其他语言环境类别:

  • LC_PAPER:默认纸张大小(由高度和宽度定义)。
  • LC_NAME, LC_ADDRESS, LC_TELEPHONE, LC_MEASUREMENT, LC_IDENTIFICATION: 我不知道有任何使用这些的应用程序。

环境变量

使用区域设置的应用程序根据环境变量确定它们。

  • 然后LANG使用环境变量的值,除非被另一个设置覆盖。如果LANG未设置,则默认语言环境为C.
  • 这些LC_xxx名称可以用作环境变量。
  • 如果LC_ALL设置,则忽略所有其他值;这主要用于设置LC_ALL=C运行应用程序,无论它们在哪里运行,都需要产生相同的输出。
  • 此外,GNU libc用于LANGUAGE定义回退LC_MESSAGES(例如LANGUAGE=fr_BE:fr_FR:en,首选比利时法语,或者如果不可用法国法语,或者如果不可用英语)。

安装语言环境

区域设置数据可能很大,因此某些发行版不会以可用形式提供它们,而是需要额​​外的安装步骤。

  • 在 Debian 上,要安装语言环境,请运行dpkg-reconfigure locales并从对话框中的列表中选择,或者编辑/etc/locale.gen然后运行locale-gen.
  • 在 Ubuntu 上,要安装语言环境,请使用语言环境locale-gen的名称作为参数运行。

您可以定义自己的语言环境

推荐

有用的设置是:

  • 设置LC_CTYPE为您对文本文件进行编码的语言和编码。确保您的终端使用该编码。
    对于大多数语言,只有编码很重要。有一些例外;例如,一个大写的iI在大多数语言,但?在土耳其(tr_TR)。
  • 设置LC_MESSAGES为您想要查看消息的语言。
  • 如果您希望 US Letter 为默认纸张尺寸,则设置LC_PAPER为,en_US如果您想要 A4 ,则设置为其他任何尺寸(例如en_GB)。
  • (可选)设置LC_TIME为您喜欢的时间格式。

如上所述,避免设置LC_COLLATELC_NUMERIC。如果您使用LANG,请通过将它们设置为 来显式覆盖这两个类别C