14

真正简单的问题。我需要在 Java 程序中读取 Unicode 文本文件。

我习惯于将纯 ASCII 文本与 BufferedReader FileReader 组合一起使用,这显然不起作用:(

我知道我可以使用 Buffered Reader 以“传统”方式读取字符串,然后使用以下方式对其进行转换:

temp = new String(temp.getBytes(), "UTF-16");

但是有没有办法将阅读器包装在“转换器”中?

编辑:文件以 FF FE 开头

4

7 回答 7

18

您不会包装 Reader,而是使用 InputStreamReader 包装流。然后你可以用你当前使用的 BufferedReader 包装它

BufferedReader in = new BufferedReader(new InputStreamReader(stream, encoding));
于 2009-06-11T08:27:45.763 回答
10

检查https://docs.oracle.com/javase/1.5.0/docs/api/java/io/InputStreamReader.html

我会使用以下内容读取源文件:

Reader in = new InputStreamReader(new FileInputStream("file"), "UTF-8"));
于 2009-06-11T08:23:57.160 回答
7

一些注意事项:

  • “UTF-16”编码可以读取带有BOM标记的 little-endian 或 big-endian 编码文件;有关 Java 6 编码的列表,请参见此处;没有明确说明使用“UTF-16”编写时将使用什么字节序 - 它似乎是大字节序 - 因此您可能希望在保存数据时使用“UnicodeLittle”
  • 使用 String 类编码/解码方法时要小心,尤其是使用标记的可变宽度编码(如 UTF-16)时 -仅在整个数据上使用它们
  • 正如其他人所说,通常最好通过使用InputStreamReader包装InputStream来读取字符数据;您可以使用StringBuilder或类似的缓冲区将输入连接成单个字符串。
于 2009-06-11T09:06:54.500 回答
2

我建议使用 Google Data API 中的 UnicodeReader,有关类似问题,请参阅此答案。它将自动从字节顺序标记 (BOM) 检测编码。

您还可以考虑Apache Commons IO 中的BOMInputStream,它的功能基本相同,但并未涵盖 BOM 的所有替代版本。

于 2015-10-22T11:13:55.293 回答
0

我只需要在 InputStreamReader 的创建中添加“UTF-8”,就可以立即看到特殊字符。

InputStreamReader istreamReader = new InputStreamReader(inputStream,"UTF-8");
BufferedReader bufferedReader = new BufferedReader(istreamReader);
于 2018-11-02T08:44:31.360 回答
-1
 Scanner scan = new Scanner(new File("C:\\Users\\daniel\\Desktop\\Corpus.txt"));
   while(scan.hasNext()){

   System.out.println(scan.nextLine());
    }
于 2014-05-19T17:55:14.247 回答
-1
String s = new String(Files.readAllBytes(Paths.get("file.txt")),"UTF-8");
于 2018-06-13T13:42:54.940 回答