我们可以用字节流在文件中写入 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字符。那么,为什么它在这种情况下有效呢?
我读到字节流不支持 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 规则转换为字节。