我们可以使用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字符。那么,为什么它会在这种情况下起作用呢?
答案 0 :(得分: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 characters”而陷入陷阱,你的文件是用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规则将文本转换为字节。
答案 1 :(得分:1)
通常最好通过将OutputStream包含OutputStreamWriter包装到Writer中来编写字符数据
Writer out = new OutputStreamWriter(new FileOutputStream("file path"), "UTF-8"));