【发布时间】:2014-06-26 06:01:27
【问题描述】:
对于 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(),not 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 internationalization locale