从语言环境到ansi代码页再到java字符集?

从语言环境到ansi代码页再到java字符集?,java,localization,character-encoding,locale,Java,Localization,Character Encoding,Locale,有没有办法从ANSI代码页获取java.nio.charset.charset,从区域设置获取ANSI代码页?例如,如果我有区域设置“en_US”,我希望有字符集“cp1252”,这样我就可以调用 private final Charset CS1252 = Charset.forName("cp1252"); 或者当我有日语的区域设置“ja_JP”时,我想得到相应的字符集,比如 private final Charset CS932 = Charset.forName("ms932");

有没有办法从ANSI代码页获取java.nio.charset.charset,从区域设置获取ANSI代码页?例如,如果我有区域设置“en_US”,我希望有字符集“cp1252”,这样我就可以调用

private final Charset CS1252 = Charset.forName("cp1252");
或者当我有日语的区域设置“ja_JP”时,我想得到相应的字符集,比如

private final Charset CS932 = Charset.forName("ms932");

我如何在java中实现这一点?因此,我需要的是一个像getCharsetForLocale(java.util.Locale loc)这样的方法。

我认为您正在尝试检索可以通过类Charset的方法获得的Charset的
规范名称。

好的,Locale和Charset之间没有内在的联系。例如,对于locale en_US,您希望使用哪个字符集?ASCII/CP1252/MacRoman/ISO-8859-1/UTF-8/UTF-16


对于日语,您至少可以使用Shift JIS、CP932、EUC-JP、ISO-2022-JP或UTF-8中的一种。

您不能使用,也没有意义。事实上,任何语言都可以用几种不同的字符编码来编写,例如英语可以用ASCII、ISO8859-1、ISO-8859-15、Windows 1252、UTF-7、UTF-8、UTF-16、UTF-32和许多其他语言来编写,基本上是用所有例如Windows代码页

我不确定你在寻找什么,所以让我建议:

  • 如果希望保存数据,请使用UTF-8,而不考虑语言环境。总是。是的,总是这样。不用担心空间问题,对于许多语言来说,它足够高效,而且磁盘空间也很便宜

  • 如果您想知道用户可能使用哪种字符编码,那么认为用户只使用一种字符编码是无效的。相反,您可以考虑使用例如(阅读更多关于检测的信息)来检测编码

  • 如果您想知道系统的当前代码页,最简单的方法是调用
    Charset.defaultCharset()


  • 下次,请先描述一下你的问题,你想实现什么,你已经尝试了什么。

    我只有一个类似“en_US”的区域设置,还没有字符集!好的,我可以做的是迭代所有可用的字符集,并尝试将我的区域设置与规范名称匹配,当我有匹配项时,我也有我的字符集。但是这似乎不是最好的解决方案。谢谢,我进一步研究了这个问题,我需要找到区域名称的ANSI-CODEPAGE。对于这个ansi代码页,我需要一个java中的字符集对象。@Christian:如果是.Net,那就很容易了。不幸的是,Java中没有直接的CultureInfo,因此您只需“手动”映射即可。Python(位于C/POSIX概念和底层库之上)有一个“语言环境的默认编码”的概念。这里的等价物是“Locale的默认字符集”。虽然UTF-8的标准化很好,但某些地区可能需要某些编码,并且这些信息可以通过编程方式获得,这一想法并不是不合理的。答案似乎没有回答这个问题。实际上,在apple JDK6中,我们可以获得语言和国家的字符集,即语言环境。如果将系统语言更改为简体中文,则默认字符集返回GB2312,而如果将设置更改为繁体中文(HK),则默认字符集为Big5。默认的字符集只返回system file.encoding值,JVM如何初始化它是未知的,因为系统道具的初始化是在本机代码中,我不知道如何检查它。