我读过字节流不支持 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 规则转换为字节。