Java 其中";默认语言环境";是哪个?

Java 其中";默认语言环境";是哪个?,java,internationalization,locale,Java,Internationalization,Locale,对于UNIX区域设置,其细分意味着有相对完善的文档记录 LC\u-COLLATE(字符串排序) LC\u CTYPE(字符转换) LC\u消息(消息显示在UI中) LC\u MONETARY(货币值格式) LC\u NUMERIC(非货币数值格式) LC_TIME(日期和时间值的格式) LANG(如果未设置上述任何一项,则返回) Java有不同的分类,与现实世界不太匹配(通常): Locale.getDefault() Locale.getDefault(Locale.Category.D

对于UNIX区域设置,其细分意味着有相对完善的文档记录

  • LC\u-COLLATE
    (字符串排序)
  • LC\u CTYPE
    (字符转换)
  • LC\u消息
    (消息显示在UI中)
  • LC\u MONETARY
    (货币值格式)
  • LC\u NUMERIC
    (非货币数值格式)
  • LC_TIME
    (日期和时间值的格式)
  • LANG
    (如果未设置上述任何一项,则返回)
Java有不同的分类,与现实世界不太匹配(通常):

  • Locale.getDefault()
  • Locale.getDefault(Locale.Category.DISPLAY)
  • Locale.getDefault(Locale.Category.FORMAT)
如果您阅读这些文档,
Locale.getDefault(Locale.Category.DISPLAY)
似乎对应于
LC\u消息
,而
Locale.getDefault(Locale.Category.FORMAT)
似乎对应于
LC\u货币
+
LC\u数字
+
LC\u时间

不过,也存在一些问题

如果您阅读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语言环境中获得它。它必须使用其他后门来获取设置,而不使用这些设置。

很难理解您在这里提出的问题。相反,您做出的声明表明您不需要成为Java程序员。没关系,真的没关系

有几件事需要澄清:

  • 自Java1.1以来,该类一直使用JDK
  • Java 7(JDK 1.7)提供了诸如、和其他许多内容
  • 语言环境感知类和方法,如、、和许多,更多的类和方法在这里都存在了相当长的时间(早在JDK1.7之前)
  • 在Java7/JDK1.7之前,只有一种获取当前操作系统语言环境的方法—调用
    Locale.getDefault()
    (即不带参数)
换句话说,在Java7之前,Java的语言环境模型简单到一个由语言、国家和可选语言环境变量组成的系统属性。Java 7改变了这一点(end在Java 8中进一步扩展…),现在您有两个系统属性,一个用于格式化,一个用于显示用户界面消息。
问题是,有大量的遗留代码是用Java编写的,当您升级平台时,这些代码不应该被破坏。这正是为什么仍然有无参数的
Locale.getDefault()
。此外(您可以自己测试),
Locale.getDefault()
基本上可以与
Locale.getDefault(Locale.Category.DISPLAY)
互换

现在,我说的是格式化和用户界面消息。基本上,格式化不仅仅是格式化,还包括字符大小写转换(
LC\u CTYPE
),排序(
LC\u COLLATE
)。除了用户界面消息,什么都可以。某种程度上,因为默认字符编码(取决于操作系统,顺便说一句)不是
语言环境的一部分。相反,你需要打电话。
而且回退规则(内置于Java中,而不是从操作系统读取)可以通过类计算出来。正如我们所知,它与用户界面类别有很大关系

Java语言环境模型不同于POSIX(而不是UNIX,它更通用)的原因很简单,因为有相当多的平台。这些平台不需要使用POSIX。。。我指的不仅仅是操作系统,还有像web这样的东西。。。Java正在努力实现通用性和多功能性。结果,Java的语言环境模型很复杂,运气不好


我必须补充一点,现在,不仅仅是语言和国家,还有诸如首选脚本、日历系统、编号系统、特定的排序设置等。它有时甚至可以工作。

谈到那些旧的API,
NumberFormat
DateFormat
MessageFormat
和family确实更新为使用
getDefault(Locale.Category.FORMAT)
,而
ResourceBundle
没有更新为使用
getDefault(Locale.Category.DISPLAY)
。因此,如果我设置
user.language.display
系统属性,它不会用于它应该用于的用途,除非我还通过我的应用程序和所有第三方库更新对
MessageFormat
的任何调用,以显式传递正确的区域设置(在我们的应用程序中这样做是可行的,但库并不是真的…)