java.util.Locale构造语言与返回不一致:id为何变为in?
为什么用
Locale("id")创建对象后,language属性返回in? 这是Java/Kotlin的Locale类处理语言代码时的历史遗留兼容问题导致的!
问题根源
印尼语的ISO 639-1语言代码原本是in,后来ISO标准把它更新为id。但为了保证旧代码的向后兼容性,Locale类的传统构造函数(比如Locale(String language))会自动将新代码id映射回旧的in,所以你调用locale.language时得到的是旧代码。
解决方案:使用Locale.Builder构建Locale
如果你希望保留现代的语言代码id,可以使用Locale.Builder类来创建Locale对象,它不会自动进行这种旧代码映射:
修改后的测试用例如下:
class LocaleTest { @Test fun english() { val locale = Locale("en") assertEquals("English", locale.displayLanguage) assertEquals("en", locale.language) } @Test fun indonesia() { // 使用Builder构建,保留id代码 val locale = Locale.Builder().setLanguage("id").build() assertEquals("Indonesian", locale.displayLanguage) assertEquals("id", locale.language) } }
补充说明
Locale的传统构造函数会对语言代码进行"规范化"处理,其中就包括这种新旧代码的映射。而Locale.Builder的setLanguage方法在传入有效的现代ISO 639-1代码时,会直接保留该值,不会触发旧代码映射。- 如果你需要处理语言标签(比如符合BCP 47标准的标签),也可以用
Locale.forLanguageTag("id"),同样能得到language为id的Locale对象。
内容的提问来源于stack exchange,提问作者Hendra Anggrian
相关产品推荐
相关产品推荐

