对于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语言环境中获取它。它必须使用其他一些后门来获取设置而不使用它们。
答案 0 :(得分:4)
很难理解你在这里问的是什么。相反,您发表的声明表明您不一定是Java程序员。没关系,真的没关系。
很少有事情需要澄清:
Locale.getDefault()
(没有参数)换句话说,在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模型很复杂,运气不好。
我必须补充说,现在,它不仅是语言和国家,还有首选脚本,日历系统,编号系统,特定整理设置等等。它有时甚至有效。