不同平台上的默认字符集是什么?

27

一些旧代码依赖于平台的默认字符集进行翻译。对于在“西方世界”中的Windows和Linux安装,我知道这意味着什么。但是考虑到俄罗斯或亚洲平台,我完全不确定它们的平台默认字符集是什么(只有UTF-16吗?)。

因此,我想知道执行以下代码行时会得到什么:

System.out.println("Default Charset=" + Charset.defaultCharset());

PS:

我不想在这里讨论字符集及其与Unicode的区别问题,我只想收集哪些操作系统会导致哪些特定字符集。请只发布具体值!

2个回答

32

这是一个用户特定的设置。在许多现代Linux系统中,它是UTF-8。在Mac上,它是MacRoman。在美国的Windows系统中,它通常是CP1250,在欧洲则是CP1252。在中国,您通常会找到简体中文(Big5或GB *)。

但这只是系统默认值,每个用户都可以随时更改。可能的解决方案是:使用系统属性file.encoding在启动应用程序时设置编码。

请参阅此答案了解如何实现。我建议将其放入一个小脚本中启动您的应用程序,以便不影响用户默认设置。


1
企业网络中的人员带着他们的全局登录信息怎么办?我想说的是:永远不要期望在其中获得任何有用的价值。在您的代码中,您应该始终在读取数据时指定数据的编码方式。如果这样做不起作用,那么您必须设置 file.encoding,否则事情会出错 :-) - Aaron Digulla
1
在用户提供数据且没有编码元数据的情况下,平台默认编码实际上可能是您最好的选择。 - Michael Borgwardt
3
我可以问一下为什么吗?如果字符集可以改变并损坏您的数据,您需要通过确保您的应用程序不会看到用户的默认值来处理此问题。如果字符集可以更改但对您的应用程序没有影响,那么为什么要费心呢? - Aaron Digulla
@Aaron:我们正在谈论程序加载的翻译。程序会检查UTF16和UTF-8,如果不适用,则使用默认字符集。这个逻辑已经使用了多年,因此我必须假设用户正在使用它来加载他们的翻译文件,但我不知道确切情况。更改它将会破坏一切。因此,我想了解可能涉及到的其他字符集的概述。 - Robert
2
@Fordi 如果在主类中导入的类中存在“static”代码,则仍然可以看到旧值。更好的解决方案是使用-Dfile.encoding=UTF-8调用Java。但这也无法解决许多文件格式默认不使用UTF-8编码或懒惰用户试图将具有未知编码的文件提供给软件的问题。 - Aaron Digulla
显示剩余4条评论

8
对于在“西方世界”的Windows和Linux安装,我知道这是什么意思。 可能没有你想象的那么清楚。
但是如果考虑俄罗斯或亚洲平台,我完全不确定他们平台的默认字符集是什么(只是UTF-16吗?)。 通常情况下,它取决于历史上在他们国家使用的编码方式。
绝对不是这样。在Unicode标准出现之前,计算机使用已经广泛传播,每个语言区域都开发了一个或多个支持其语言的编码。那些只需要ASCII字符集外少于128个字符的人通常会开发“扩展ASCII”,其中许多最终被标准化为ISO-8859,而其他人则开发了双字节编码,通常有几种竞争对手。例如,在日本,电子邮件通常使用JIS,而网页使用Shift-JIS,一些应用程序使用EUC-JP。在Java中,任何这些编码都可能遇到作为平台默认编码。
这一切都是一团糟,这正是Unicode开发的原因。但是混乱还没有消失,我们仍然需要处理它,并且不应该对将一堆字节解释为文本的编码做任何假设。纯文本不存在

迈克尔,你是如此的正确,它让我感动得流泪。这真是一场灾难,我甚至考虑过猴子补丁标准库以禁止“默认编码”。我的千兆字节语料库已经被这个问题无法修复地毁坏了。问题在于不合理的Java默认设置,而不是Java本身,它肯定可以应对这个问题。我不知道如何系统性地解决它,因为从时间开始到结束,保持与错误兼容似乎是Java的* modus operandi *。我不知道如何解决设计缺陷。 - tchrist
1
事实是,您无法“不做任何假设”。用户编写没有编码指示的纯文本文件。旧系统存储具有未知编码的字符串。 - plugwash

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