java - 为什么我的字符串返回 "\ufffd\ufffdN a m e"

标签 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());
    }
}

出于某种原因,我无法读取仅包含此文件的文件“ 名称 Intel(R) Core(TM) i5-2500 CPU @ 3.30GHz "

当我调试代码时,String s 返回为“\ufffd\ufffdN a m e”,我不知道这些额外字符的来源。这使我无法正确读取文件。

最佳答案

\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 转换格式,由可选字节顺序标记标识的字节顺序

关于java - 为什么我的字符串返回 "\ufffd\ufffdN a m e",我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24493220/

相关文章:

java - 根据属性文件渲染SelectItem

Javascript - FileReader 如何一次读取和处理多个文件中的每个文件

javascript - 如何读取通过 cordova 文件插件写入的对象?

java - BufferedReader 已初始化但 readLine 返回 null?

python - 对大型 .csv 文件使用缓冲阅读器,Python

Java读取文件的问题

javascript - Canvas 中的 SVG 使用 Fabric js 和 FileReader API

java - 如何测量/计算文档需要呈现的大小?

java - 部署新 war 时自动运行 Flyway 数据库迁移

java - System.setProperty ("user.timezone"和 "America/Chicago"之间的区别;和 TimeZone.setDefault(TimeZone.getTimeZone ("America/Chicago"));