2

我正在开发的应用程序将被西欧和东欧以及美国的人们使用。我正在使用 UTF-8 字符集对输入进行编码和对输出进行解码。

我的困惑是因为当我使用这个方法 String(byte[] bytes, String charsetName) 时,我提供 UTF-8 作为 charsetname,而它确实是一个字符编码。我的默认设置在 Eclipse 中设置为 Cp1252。

这是否意味着,如果我在美国的 Java 应用程序中使用 Cp1252 作为我的字符集编码和 UTF-8 作为我的字符集名称创建了一个输出文本文件,欧洲的人们是否能够在我的 Java 应用程序中读取这个文件并且反之亦然?

4

3 回答 3

11

它们是编码。遗憾的是,Java 在真正意味着“编码”时到处使用“字符集”,但现在很难解决 :( 恼人的是,IANA 犯了同样的错误

实际上,按照Unicode 术语,它们可能是最准确的字符编码方案

一种字符编码形式加上字节序列化。Unicode 中有七种字符编码方案:UTF-8、UTF-16、UTF-16BE、UTF-16LE、UTF-32、UTF-32BE 和 UTF-32LE。

其中字符编码形式为:

从字符集定义映射到用于表示数据的实际代码单元。

是的,Unicode 只定义了七种字符编码形式这一事实使这更加令人困惑。从根本上说,大多数开发人员需要知道的是,Java 术语中的“字符集”是文本数据 ( String, char[]) 和二进制数据 ( byte[]) 之间的映射。

于 2013-03-11T20:51:33.223 回答
1

我认为这两件事没有直接关系。

Eclipse 设置决定了您的 Eclipse 编辑器将如何保存您创建/编辑的文本文件(通常是源代码)。您可以使用其他编辑器,因此文件可能会保存在其他编码方案中。只要您的 java 编译器在编译源代码时没有问题,您就是安全的。

java String(byte[] bytes, String charsetName) 是您自己的应用程序逻辑,用于处理您希望如何解释从文件或网络读取的某些数据。不同的 charsetName(本质上是不同的字符编码方案)可能对字节数组有不同的解释。

于 2013-03-11T21:02:34.423 回答
1

“字符集”确实暗示了文本使用的字符集。对于 UTF-8/16,字符集恰好是“所有”字符。对于其他人,不一定。过去,每个人都在发明自己的字符集和编码方案,两者几乎是一对一的映射,因此一个名称可以同时指代字符集和编码方案。

于 2013-03-11T22:00:32.980 回答