从文本文件中读取的第一个字符:

Mil*_*n90 14 java unicode character-encoding filereader

如果我写这个代码,我把它作为输出 - >首先:然后是其他行

try {
    BufferedReader br = new BufferedReader(new FileReader(
            "myFile.txt"));

    String line;
    while (line = br.readLine() != null) {
        System.out.println(line);
    }
    br.close();

} catch (FileNotFoundException e) {
    e.printStackTrace();
} catch (IOException e) {
    e.printStackTrace();
}
Run Code Online (Sandbox Code Playgroud)

我怎么能避免呢?

Nay*_*uki 18

你在第一行得到了字符因为这个序列是UTF-8字节顺序标记(BOM).如果文本文件以BOM开头,则可能是由记事本等Windows程序生成的.

为了解决您的问题,我们选择显式读取文件为UTF-8,而不是默认的系统字符编码(US-ASCII等):

BufferedReader in = new BufferedReader(
    new InputStreamReader(
        new FileInputStream("myFile.txt"),
        "UTF-8"));
Run Code Online (Sandbox Code Playgroud)

然后在UTF-8中,字节序列解码为一个字符,即U + FEFF.此字符是可选的 - 合法的UTF-8文件可能也可能不以它开头.因此,只有当它是U + FEFF时我们才会跳过第一个字符:

in.mark(1);
if (in.read() != 0xFEFF)
  in.reset();
Run Code Online (Sandbox Code Playgroud)

现在,您可以继续使用其余代码.


Tal*_*ala 2

问题可能出在使用的编码上。尝试这个:

BufferedReader in = new BufferedReader(new InputStreamReader(
      new FileInputStream("yourfile"), "UTF-8"));
Run Code Online (Sandbox Code Playgroud)

  • 我已经尝试过了。 变为 '?' (2认同)