【问题标题】:Read unicode text files with java用java读取unicode文本文件
【发布时间】:2010-11-02 01:41:01
【问题描述】:

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

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

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

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

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

编辑:文件以 FF FE 开头

【问题讨论】:

    标签: java string unicode ascii


    【解决方案1】:

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

    我会用类似这样的方式读取源文件:

    Reader in = new InputStreamReader(new FileInputStream("file"), "UTF-8"));
    

    【讨论】:

      【解决方案2】:

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

      InputStreamReader istreamReader = new InputStreamReader(inputStream,"UTF-8");
      BufferedReader bufferedReader = new BufferedReader(istreamReader);
      

      【讨论】:

        【解决方案3】:
        String s = new String(Files.readAllBytes(Paths.get("file.txt")),"UTF-8");
        

        【讨论】:

          【解决方案4】:

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

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

          【讨论】:

            【解决方案5】:
             Scanner scan = new Scanner(new File("C:\\Users\\daniel\\Desktop\\Corpus.txt"));
               while(scan.hasNext()){
            
               System.out.println(scan.nextLine());
                }
            

            【讨论】:

            • Scanner 类是 unicode 特有的吗?仅仅阅读代码(并且不知道这些事情)很难确定这是否真的回答了问题。对于 OP 可能需要一些概念性理解和代码的问题,在您的答案中包含为什么代码有效的简短文本描述很有用。这样的描述在这里将是有益的。另外,我已经编辑了您的帖子以将代码放入“代码标记”中,请在未来做同样的事情,因为它更容易阅读。欢迎使用 StackOverflow!
            【解决方案6】:

            一些注意事项:

            • “UTF-16”编码可以读取标有BOM 的小端或大端编码文件;有关 Java 6 编码的列表,请参阅 here;没有明确说明使用“UTF-16”编写时将使用什么字节序 - 它似乎是大字节序 - 因此您可能希望在保存数据时使用“UnicodeLittle”
            • 使用 String 类编码/解码方法时要小心,尤其是使用标记的可变宽度编码,如 UTF-16 - use them only on whole data
            • 正如其他人所说,通常最好通过用InputStreamReader 包装您的InputStream 来读取字符数据;您可以使用StringBuilder 或类似的缓冲区将concatenate your input 转换为单个字符串。

            【讨论】:

            • 感谢编码类型的链接。我找到了适合我的那个。
            【解决方案7】:

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

            BufferedReader in = new BufferedReader(new InputStreamReader(stream, encoding));
            

            【讨论】:

            • 我想读希伯来字母,用“编码”代替什么?
            • 回答我自己的问题,它是“UTF-8”
            • '构造函数BufferedReader(InputStreamReader)未定义'?
            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 2010-11-11
            • 1970-01-01
            • 1970-01-01
            • 2016-08-08
            • 2011-06-10
            • 2011-04-06
            相关资源
            最近更新 更多