我试图通过java中的缓冲输出流在Windows Notepad中编写阿拉伯语单词,并且在写入记事本的字符集编码后变为UTF-8所以很明显在java中编写文件的默认字符集是UTF-8但是奇迹当我通过缓冲输入流读取它时,它不会被UTF-8编码读取,因为在读取它时结果是奇怪的符号
enter code here
class writeFile extends BufferedOutputStream {
public writeFile(OutpuStream out){
super(out);
}
public static void main(String arg[])
{ writeFile out=new writeFile(new FileOutputStream(new
File("path_String")));
out.write("مكتبة".getByte());
}}
它可以写成,但在阅读时:
enter code here
class readFile extends BufferedInputStream {
public readFile(InputStream In){
super(In);
}
public static void main(String arg[])
{ readFile in=new readFile(new FileInputStream(new
File("path_String")));
int c;
while((c=in.read()!=-1)
System.out.print((char)c);
}}
结果不像以前写的文件那样:ÙÙتبة
这样写java的意思是使用UTF-8编码,在阅读时使用其他编码吗?
答案 0 :(得分:1)
问题不在于它不能用UTF-8阅读,而是你在阅读操作中诋毁编码。 FileInputStream.read()
非常清楚地说明一次读取一个字节。如果文件中有多字节序列,则转换为字符的字节不会起作用(几乎可以肯定,因为它是阿拉伯语)。
正如您所知,最简单的解决方案是使用InputStreamReader
,它从基础FileInputStream
(或其他流)读取字节,并正确解码字符序列。这里的默认编码当然与编写器相同:
InputStreamReader
是从字节流到字符流的桥接:它使用指定的字符集读取字节并将其解码为字符。它使用的字符集可以通过名称指定,也可以明确指定,或者可以接受平台的默认字符集。
你可以通过将整个文件读入字节缓冲区然后使用String(byte[])
之类的东西解码整个来做类似的事情。如果您读取整个文件,结果应该是相同的,因为现在解码器将有足够的信息来正确地解析出所有多字节字符。
我发现编码和解码的参考资料对于理解这个主题非常有用:http://kunststube.net/encoding/