1

我们可以用 ByteStreams 在文件中写入 Unicode 数据吗?我的代码是:

 public static void main(String[] args) throws Exception {

    String str = "Русский язык ";
    FileOutputStream fos = new FileOutputStream("file path");
    fos.write(str.getBytes());
    fos.flush();
    fos.close();
}

在这里,我使用字节流写入 unicode 数据,但它正在正确写入。我是 java 新手,但我读过字节流不支持 unicode 字符。那么,为什么它在这种情况下有效?

4

2 回答 2

3

我读过字节流不支持 unicode 字符。

要么您使用了错误的信息来源,要么您可能误解了某些内容。字节流支持字节。因此字节流支持任何可以用字节表示的东西。视频、文字、图片、音乐……如果字节流不支持,那根本就不能用在数字电脑上。

以简单的 1 和 0 序列表示这些事物的技巧是使用商定的规则。您将根据某些规则对文本进行编码,然后接收者可以使用相同的规则将其解码回来。

"Русский язык"可以用任何支持西里尔字符的编码表示为字节。在 unicode 的任何编码中:UTF-8、UTF-16、UTF-32;Windows-1251、KOI8-R、KOI8-U、ISO-8859-5...

这并不意味着这些编码相互兼容。在编码西里尔字母时,它们都是不兼容的,因此以一种编码编码的文本必须严格以该编码解码。

.getBytes()使用平台默认编码,恰好是支持西里尔文的一种。您可能认为它是 UTF-8,但如果您使用的是 Windows,则它更有可能是 Cp1251。不要陷入陷阱,仅仅因为您使用了“unicode 字符”,您的文件就以 UTF 编码进行了物理编码。这将导致编码问题。

因此,始终要明确编码,以便您的程序在任何平台上都可以正常工作,并且您始终知道程序创建的文件的编码是什么。使用您的代码,您可以这样做:

String str = "Русский язык ";
FileOutputStream fos = new FileOutputStream("file path");
fos.write(str.getBytes("UTF-8"));
fos.flush();
fos.close();

或者按照其他答案的建议:

String str = "Русский язык ";
OutputStreamWriter osw = new OutputStreamWriter(
        new FileOutputStream("file path"), "UTF-8"
);
osw.write(str);
osw.flush();
osw.close();

这些在技术上完全相同;文本正在根据 UTF-8 规则转换为字节。

于 2012-12-14T10:22:15.273 回答
1

通常最好通过将 OutputStream 与 OutputStreamWriter 包装到 Writer 中来写入字符数据

Writer out = new OutputStreamWriter(new FileOutputStream("file path"), "UTF-8"));
于 2012-12-14T06:02:41.817 回答