Which quot;default Localequot; is which?(哪个默认区域设置是哪个(Q)?)
问题描述
对于Unix区域设置,其细分意味着有相对较好的文档记录。
LC_COLLATE
(字符串排序)LC_CTYPE
(字符转换)LC_MESSAGES
(消息显示在UI中)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()
、NOTLocale.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));
}
}
根据我的外壳进行区域设置:
$ 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程序员。没关系,没什么大不了的。
需要澄清的几件事:
- Locale类从Java 1.1开始在JDK中
- Java 7(JDK 1.7)中提供了Locale.Builder、Locale.Category和许多其他内容
- 支持区域设置的类和方法,如DateFormat、NumberFormat、Collator、ResourceBundle、String.toLowerCase(Locale)、String.toUpperCase(Locale)以及更多的类和方法在这里存在了相当长的时间(早在JDK 1.7之前)
- 在Java 7/JDK 1.7之前,获取当前操作系统区域设置只有一种方法-调用
Locale.getDefault()
(即不带参数)
问题是,有大量的遗留代码是用Java编写的,当您升级平台时,这些代码不应该被破坏。这就是为什么你仍然有无参数的
Locale.getDefault()
。而且(您可以自己测试一下),Locale.getDefault()
基本上可以和Locale.getDefault(Locale.Category.DISPLAY)
互换。
现在,我说的是格式和用户界面消息。基本上,格式化不仅是格式化,还包括字符大小写转换(LC_CTYPE
)、排序(LC_COLLATE
)等。除了用户界面消息以外的任何东西。差不多,因为默认字符编码(取决于操作系统、BTW)不是Locale
的一部分。您需要调用Charset.defaultCharset()。
并且可以使用ResourceBundle.Control类来制定后备规则(内置在Java中,而不是从操作系统读取)。而且我们知道,它与用户界面类别有很大关系...
Java Locale Model不同于POSIX(不是Unix,它更通用)的原因很简单,那就是有相当多的平台。而且这些平台不一定使用POSIX...我的意思是不仅是操作系统,还有像网络这样的东西。Java正在努力成为通用和通用的语言。因此,Java的语言环境模型非常复杂,运气不佳。
我必须补充的是,如今,不仅是语言和国家,还包括首选脚本、日历系统、编号系统、特定的校对设置等等。它有时甚至会起作用。
这篇关于哪个默认区域设置是哪个(&Q)?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持编程学习网!
本文标题为:哪个默认区域设置是哪个(&Q)?
基础教程推荐
- 如何强制对超级方法进行多态调用? 2022-01-01
- Java 中保存最后 N 个元素的大小受限队列 2022-01-01
- 如何对 HashSet 进行排序? 2022-01-01
- Spring Boot Freemarker从2.2.0升级失败 2022-01-01
- 如何使用 Stream 在集合中拆分奇数和偶数以及两者的总和 2022-01-01
- 由于对所需库 rt.jar 的限制,对类的访问限制? 2022-01-01
- 如何使用 Eclipse 检查调试符号状态? 2022-01-01
- 在螺旋中写一个字符串 2022-01-01
- 首次使用 Hadoop,MapReduce Job 不运行 Reduce Phase 2022-01-01
- 如何在不安装整个 WTP 包的情况下将 Tomcat 8 添加到 Eclipse Kepler 2022-01-01