尝试读取文本文件时输出错误

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:你好

为什么我会得到这些奇怪的输出?我的代码有问题吗?或者还有其他原因

Jon*_*eet 5

您的文件以字节顺序标记(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时看到正确的输出而不是每个"真实"字符之间的额外字符.