在 Java-8 Locale 对象中,将某些语言代码转换为旧 ISO。我如何在不更新 Java 版本的情况下解决此问题?

In Java-8 Locale Object convert to old ISO in some Language code. How can i fix this issue without update Java version?

就像我接受输入 (he-IL) 然后输出像“iw_IL”。但我不想把它转换成旧的 iso。

public static void main(String[] args) {
    Locale locale = getLocaleIn("he-IL");
    System.out.println(locale.toString());
}
private static Locale getLocaleIn(String langCode) {
    LocaleCode code = LocaleCode.getByCodeIgnoreCase(langCode);
    Locale locale = code.toLocale();
    return locale;
}

输出: iw_IL, 预期输出: 他-IL

这里的主要问题,Java Locale.Class:

最后我想要一个语言环境对象而不转换为旧 ISO。

您应该在问题描述中避免使用非标准的第 3 方 类,尤其是当他们对问题根本没有贡献时。

我们可以简单地使用

Locale locale = new Locale("he", "IL");
System.out.println(locale.toString());
locale = new Locale("iw", "IL");
System.out.println(locale.toString());

并得到

iw_IL
iw_IL

下JDK8,符合the documentation:

This constructor accepts both the old codes ("iw", "ji", and "in") and the new codes ("he", "yi", and "id"), but all other API on Locale will return only the OLD codes.

这已经改变了with JDK 17

Obsolete ISO 639 codes ("iw", "ji", and "in") are mapped to their current forms.

和 运行 具有 JDK 17 的相同示例程序现在相应地打印

he_IL
he_IL

因此,解决您的问题的最干净且可能是唯一的解决方案是更新 Java 版本。任何强制 Locale 到 return 旧版本中的新代码的补丁都可能导致与依赖旧行为的运行时其他组件的兼容性问题。