You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.28 04:00:03