为什么我的String返回“\ ufffd \ ufffdN a m e”

时间:2014-06-30 15:05:45

标签: java bufferedreader filereader

这是我的方法

public void readFile3()throws IOException
{
    try
    {
        FileReader fr = new FileReader(Path3);
        BufferedReader br = new BufferedReader(fr);
        String s = br.readLine();
        int a =1;
        while( a != 2)
        {
            s = br.readLine();
            a ++; 

        }
        Storage.add(s);

        br.close();

    }
    catch(IOException e)
    {
        System.out.println(e.getMessage());
    }
}

由于某种原因,我无法读取仅包含此内容的文件" 名称 英特尔(R)酷睿(TM)i5-2500 CPU @ 3.30GHz"

当我调试代码时,String s被返回为" \ ufffd \ ufffdN a m e"我不知道这些额外的字符来自哪里..这阻止我正确阅读文件。

3 个答案:

答案 0 :(得分:7)

\ ufffd是unicode中的替换字符,当您尝试读取在unicode中没有表示的代码时使用它。我想你是在Windows平台上(或者至少你读到的文件是在Windows上创建的)。 Windows支持许多文本文件格式,最常见的是Ansi:每个字符都有代表,但代码是ansi代码。

但Windows可以直接使用UTF16,其中每个字符由其unicode代码表示为16位整数,因此每个字符有2个字节。这些文件使用特殊标记(Windows方言中的字节顺序标记)来表示:

  • 文件编码为每个字符2个(甚至4个)字节
  • 编码是小端或大端

(参考:MSDN上的Using Byte Order Marks

当您在前两个替换字符N a m e而不是Name之后编写时,我认为您有一个UTF16编码的文本文件。记事本可以透明地编辑这些文件(甚至没有说出实际格式),但其他工具确实存在问题... 优秀的vim可以读取具有不同编码的文件并在它们之间进行转换。

如果要在java中直接使用此类文件,则必须使用UTF-16字符集。来自Charset上的JaveSE 7 javadoc: UTF-16十六位UCS转换格式,由可选字节顺序标记标识的字节顺序

答案 1 :(得分:4)

您必须在读取文件时指定编码,在您的情况下可能是UTF-16。

Reader reader = new InputStreamReader(new FileInputStream(fileName), "UTF-16");
BufferedReader br = new BufferedReader(reader);

查看文档以获取更多详细信息:InputStreamReader class

答案 2 :(得分:0)

检查文件是.odt,.rtf还是.txt以外的其他内容。这可能是导致额外的UTF-16字符出现的原因。另外,请确保(即使它是.txt文件)您的文件以UTF-8字符编码。

也许您的文档中包含UTF-16字符,例如“®”。