哪个“默认语言环境”是哪个?

时间:2014-06-26 06:01:27

标签: java internationalization locale

对于UNIX语言环境,其细分意味着相对较好的文档。

  • LC_COLLATE(字符串整理)
  • LC_CTYPE(角色转换)
  • LC_MESSAGES(用户界面显示的消息)
  • LC_MONETARY(货币价值格式)
  • LC_NUMERIC(非货币数值的格式)
  • LC_TIME(日期和时间值的格式设置)
  • LANG(如果未设置上述任何内容,则回退)

Java有一个不同的分类,与现实世界不太匹配(像往常一样):

  • Locale.getDefault()
  • Locale.getDefault(Locale.Category.DISPLAY)
  • Locale.getDefault(Locale.Category.FORMAT)

如果您阅读有关这些内容的文档,Locale.getDefault(Locale.Category.DISPLAY)似乎与LC_MESSAGES相对应,而Locale.getDefault(Locale.Category.FORMAT)似乎与LC_MONETARY + LC_NUMERIC +的某些组合相对应LC_TIME

但是存在问题。

如果您阅读了JDK源代码,您会发现许多令人担忧的事情。例如,ResourceBundle.getBundle(String) - 完全是关于字符串消息的 - 使用Locale.getDefault()不是 Locale.getDefault(Locale.Category.DISPLAY)

所以我想我想知道的是:

应该将哪些方法用于哪个目的?

相关,但我制作了一个小测试程序,以查看哪些Java语言环境与哪些UNIX语言环境相对应,并获得更令人惊讶的结果。

import java.util.Locale;

public class Test {
    public static void main(String[] args) {
        System.out.println("  Unqualified:  " + Locale.getDefault());
        System.out.println("  Display:      " + Locale.getDefault(Locale.Category.DISPLAY));
        System.out.println("  Format:       " + Locale.getDefault(Locale.Category.FORMAT));
    }
}

根据我的shell定位:

$ locale
LANG="en_US.UTF-8"
LC_COLLATE="en_US.UTF-8"
LC_CTYPE="en_US.UTF-8"
LC_MESSAGES="en_US.UTF-8"
LC_MONETARY="en_US.UTF-8"
LC_NUMERIC="en_US.UTF-8"
LC_TIME="en_US.UTF-8"
LC_ALL="en_US.UTF-8"

计划的输出:

$ java Test
  Unqualified:  en_AU
  Display:      en_AU
  Format:       en_AU

事实证明,Java甚至没有从UNIX语言环境中获取它。它必须使用其他一些后门来获取设置而不使用它们。

1 个答案:

答案 0 :(得分:4)

很难理解你在这里问的是什么。相反,您发表的声明表明您不一定是Java程序员。没关系,真的没关系。

很少有事情需要澄清:

换句话说,在Java 7之前,Java的Locale Model就像一个由语言,国家和可选的locale变体组成的系统属性一样简单。 Java 7已经改变了(Java 8进一步扩展了结束),现在你有两个系统属性,一个用于格式化,一个用于显示用户界面消息。
问题是,有大量用Java编写的遗留代码,这在升级平台时不应该破坏。这就是为什么你仍然有无参数Locale.getDefault()的原因。此外(您可以自己测试),Locale.getDefault()基本上可以与Locale.getDefault(Locale.Category.DISPLAY)互换。

现在,我说格式化和用户界面消息。基本上,格式化不仅仅是格式化,还包括字符大小写转换(LC_CTYPE),排序规则(LC_COLLATE)。排除除用户界面消息之外的任何内容排序,因为默认字符编码(取决于操作系统,BTW)不是Locale的一部分。相反,您需要致电Charset.defaultCharset() 并且可以使用ResourceBundle.Control类来计算回退规则(使用Java构建,而不是从OS中读取)。而且正如我们所知,它与UI类别相关......

Java Locale Model与POSIX(不是UNIX,它更普遍)不同的原因是,有很多平台。而且这些平台并不是必须使用POSIX ......我的意思不仅仅是操作系统,还有像web这样的东西...... Java正在努力实现通用性和通用性。结果Java的Locale模型很复杂,运气不好。

我必须补充说,现在,它不仅是语言和国家,还有首选脚本,日历系统,编号系统,特定整理设置等等。它有时甚至有效。

相关问题