Ely*_*deh 1 java character-encoding java-io
我想阅读并打印文本文件到控制台,所以我用下面的代码做了这个
File file = new File("G:\\text.txt");
FileReader fileReader = new FileReader(file);
int ascii = fileReader.read();
while (ascii != -1)
{
result = result + (char) ascii;
ascii = fileReader.read();
}
System.out.println(result);
Run Code Online (Sandbox Code Playgroud)
虽然我得到了正确的结果,但在某些情况下我会得到一些奇怪的结果.假设我的文本文件中包含此文本:
Hello to every one
Run Code Online (Sandbox Code Playgroud)
为了得到一个文本文件我用过记事本,当我改变编码模式时,我的代码会得到奇怪的输出.
安西:大家好
Unicode:ÿþhellotoeveryone
Unicode大端:þÿhellotoeveryone
UTF-8:你好
为什么我会得到这些奇怪的输出?我的代码有问题吗?或者还有其他原因
您的文件以字节顺序标记(U + FEFF)开头.它应该只出现在文件的第一个字符中 - 它并没有被广泛使用,但各种Windows工具都包含它,包括记事本.你可以从第一行的开头剥离它.
顺便说一句,我强烈建议不要使用FileReader- 它不允许您指定编码.我使用Files.newBufferedReader,并指定编码或让它默认为UTF-8(而不是使用的系统默认编码FileReader).当你使用时BufferedReader,你也可以一次只读一行readLine():
String line;
while ((line = reader.readLine()) != null) {
System.out.println(line.replace("\uFEFF", ""));
}
Run Code Online (Sandbox Code Playgroud)
如果你真的想一次读一个字符,那么习惯于StringBuilder在循环中使用而不是重复的字符串连接.另请注意,您的变量名称具有ascii误导性:它实际上是UTF-16代码单元,可能是也可能不是ASCII字符.
您指定的编码应该与用于编写文件的编码匹配 - 此时,您应该在使用Unicode和Unicode big endian时看到正确的输出而不是每个"真实"字符之间的额外字符.