我想知道如何让我的代码在不同平台(至少是 windows 和 linux)上产生相同的输出(UTF-8 或 UTF16)。
我认为可以设置应用程序使用的代码页,但我找不到设置代码页的信息。而且我不知道在使用特殊字符(如 äöü 或其他非拉丁字符)时设置代码页是否真的会产生相同的输出。
我想要一个无需为 java.exe 设置参数即可工作的解决方案。
编辑:
我的意思是输出到控制台。关于对其他输出媒体的可能影响的评论会很好。
我想知道如何让我的代码在不同平台(至少是 windows 和 linux)上产生相同的输出(UTF-8 或 UTF16)。
我认为可以设置应用程序使用的代码页,但我找不到设置代码页的信息。而且我不知道在使用特殊字符(如 äöü 或其他非拉丁字符)时设置代码页是否真的会产生相同的输出。
我想要一个无需为 java.exe 设置参数即可工作的解决方案。
编辑:
我的意思是输出到控制台。关于对其他输出媒体的可能影响的评论会很好。
Javachar
类型使用 UTF-16,它能够表示 Unicode 字符集中的每个代码点。几乎所有使用字符串的 I/O 都涉及一些隐式转码操作。
要保存和恢复字符数据而不会丢失或损坏,通常最好使用其中一种 Unicode 转换格式。有读取器和写入器类型可用于执行此转码操作。避免使用默认构造函数,因为它们依赖于默认编码,这可能是几十年前最好的遗留编码。通常首选明确指定 UTF-8。
写入终端有不同的问题。在这里,您正在编写将由另一个应用程序解码的数据,因此您必须以它可以理解的格式编写字符数据。
该Console
类型将检测并使用终端的编码,而System.out
使用默认的平台编码 - 由于一系列历史原因,这些在 Windows 上是不同的。此处指出了其他差异。在 cmd.exe 中使用 Unicode 的记录方法是使用适当的 Win32 API 调用。
我博客中的一些相关帖子:
BalusC在字符处理的一些实际问题上也有一篇很好的文章:Unicode - How to get the characters right?
字符集(或代码页,因为它曾经被称为)将字符序列转换为字节序列。
在 Java API 中,字符集作为Charset
. 所有在字符和字节之间转换的 API 元素都可以提供要使用的字符集(许多还允许您传递字符集名称,因此您不必自己进行查找)。如果您不提供字符集,这些方法通常会退回到操作系统的默认编码。
例如,OutputStreamWriter
具有一个采用字符集的构造函数:
try (Writer w = new OutputStreamWriter(System.out, "utf-8")) {
w.write("Hello world");
}