从区域设置到ANSI代码页再到Java字符集?

3

有没有一种方法可以从ANSI CODEPAGE获取java.nio.charset.Charset并从区域设置获取ansi codepage?例如,如果我的区域设置为“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)这样的方法。

似乎答案并没有回答问题。实际上,在苹果JDK6中,我们可以获取语言和国家(即区域设置)的字符集。如果我们将系统语言更改为简体中文,则默认字符集返回GB2312,而如果您将设置更改为繁体中文(香港),则默认字符集为Big5。默认字符集只返回系统file.encoding值,JVM如何初始化它是未知的,因为系统属性的初始化在本地代码中进行,我不知道如何检查它。 - xiaohei
3个回答

4
您不能这样做,也没有意义。实际上,任何语言都可以使用多种字符编码进行编写,例如英语可以使用ASCII、ISO8859-1、ISO-8859-15、Windows 1252、UTF-7、UTF-8、UTF-16、UTF-32等许多不同的编码方式,基本上包括所有Windows代码页。
我不确定您在寻找什么,让我建议一下:
  1. 如果您想保存数据,请使用UTF-8,不管Locale是什么。一直都是这样。不要担心空间,对于许多语言来说,它已经足够高效了,而且磁盘空间很便宜。

  2. 如果您想知道用户可能使用的字符编码类型,那么认为他们只受限于单一编码类型是无效的。相反,您可以考虑使用ICU Charset Detector来检测编码类型(在这里阅读更多关于检测的内容)。

  3. 如果您想知道系统的当前代码页,最简单的方法(并且与操作系统无关!)是调用Charset.defaultCharset()

下次,请先描述您的问题,您想要实现什么以及您已经尝试过什么。


1
谢谢,我进一步研究了这个问题,我需要找到一个区域设置名称的ANSI-CODEPAGE。而为了这个ANSI-CODEPAGE,我需要在Java中使用一个字符集对象。 - Christian Schiepe
2
@Christian:如果是 .Net 的话,那就很容易了。不幸的是,在 Java 中没有直接的 CultureInfo,因此你只需要手动映射即可。 - Paweł Dyda
1
Python(基于C / POSIX概念和底层库)具有“区域设置的默认编码”的概念。这里的等效物是“区域设置的默认字符集”。尽管在UTF-8上进行标准化非常好,但某些区域设置可能需要特定的编码,并且可以通过编程方式获得此信息,这并不是不合理的想法。 - Adam Burke

0

我认为你正在尝试检索字符集的规范名称,这可以通过Charset类的name()方法获得。


我所拥有的仅仅是一个像“en_US”这样的本地化信息,但还没有字符集!好的,我可以遍历所有可用的字符集,并尝试将我的本地化信息与规范名称匹配,当我找到匹配时,也就找到了我的字符集。但这似乎不是最佳解决方案。 - Christian Schiepe

0
据我所知,区域设置和字符集之间没有固有的联系。例如,对于区域设置en_US,您期望使用哪种字符集?ASCII/CP1252/MacRoman/ISO-8859-1/UTF-8/UTF-16?
而对于日语,您至少可以使用Shift JIS、CP932、EUC-JP、ISO-2022-JP或UTF-8中的一种。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接