【问题标题】:Reading unicode lines from files conversion UTF-8从文件转换 UTF-8 中读取 unicode 行
【发布时间】:2015-10-26 17:01:23
【问题描述】:

我正在读取一个在文本中包含 unicode 转义序列的文件,这里是示例:

\u201c@hannah_hartzler:排队等候看门人! @nerk97 @ShannonWalkup\u201d\ud83d\ude0d\ud83d\ude0d\ud83d\ude0d\ud83d\ude0d\u2764\u2764\u2764

当我用BufferedReader 读取它并用FileWriter 将它写回另一个文件时,文本变成这样:

——@hannah_hartzler:排队等候看门人! @nerk97 @ShannonWalkupâ€ðŸ∼ðŸ∼ðŸ∼ðŸ∼â¤â¤â¤

由于是 UTF-8 编码,但我想要的是:

“@hannah_hartzler:排队等候看门人! @nerk97 @ShannonWalkup”??????????????????❤❤❤

我的问题是,如何正确读取和写入文本行,以便打印正确的字符?

我不会'修改文本行,这只是unicode和utf-8之间转换的问题,这是我的代码:

FileReader fileReader = new FileReader("tweets.json");
BufferedReader bufferedReader = new BufferedReader(fileReader);
File tmp = new File("out.txt");
FileWriter fileWriter = new FileWriter(tmp);
BufferedWriter bw = new BufferedWriter(fileWriter);
...
String line = bufferedReader.readLine();
bw.write(line);

【问题讨论】:

  • 您的平台默认编码是 UTF8,您的代码只是创建原始文件的精确副本,或者不是,您正在创建文件的副本,但使用不同的编码.新文件仍然包含 unicode 转义序列。您需要一些代码来提取 unicode 转义序列并将它们转换为实际字符。该文件是否真的包含转义序列,或者您的文本编辑器是否将特殊字符转换为转义序列?

标签: java unicode utf-8 character-encoding


【解决方案1】:

当您通过new FileReader("tweets.json"); 打开文件时,其内容将使用系统的默认编码进行解释。当您通过new BufferedWriter(fileWriter) 打开目标文件时,字符将再次通过系统的默认编码进行编码。这可能看起来文件是按原样复制的,但不幸的是,事情并不是那么简单。

当文件的实际字符编码与系统的默认编码不匹配时,这种误解可能会导致某些字节被归类为无效,这将导致未指定的行为,这些“字符”可能会被过滤掉或被替换字符替换,根据目标文件中的真实编码可能会导致乱码甚至无效字符。

作为Andreas correctly pointed out,第一个字符已被复制而没有损坏,但显示不正确,因为无论您使用什么工具打开文件,都将内容再次误解为Windows-1252。但是,其他一些字符似乎受到了不可逆转的损坏(但这也可能是复制到本网站的结果)……

您可以使用构造函数
new InputStreamReader(new FileInputStream("tweets.json"), StandardCharsets.UTF_8)
new OutputStreamWriter(new FileOutputStream(tmp), StandardCharsets.UTF_8) 正确解释UTF-8 文件,或者更好的是,直接复制文件而不解释其内容

Files.copy(Paths.get("tweets.json"), Paths.get("out.txt"));

或者,如果您真的想手动进行复制循环

try(FileChannel in =FileChannel.open(Paths.get("tweets.json"),READ);
    FileChannel out=FileChannel.open(Paths.get("out.txt"),WRITE,CREATE,TRUNCATE_EXISTING)){
    long size=in.size(), trans=out.transferFrom(in, 0, size);
    for(long p=trans; p<size && trans>0; p+=trans)
        trans=out.transferFrom(in, p, size-p);
}

(假设你做了一个import static java.nio.file.StandardOpenOption.*;

如果您以这种方式复制文件,您可以确保不会发生损坏。然后,您可以专注于使用编辑器,在打开副本时使用正确的编码读取它们。

【讨论】:

    【解决方案2】:

    Unicode 字符 (\u201c) 编码为 UTF-8 为:

    \xE2\x80\x9C
    

    Windows-1252 中的样子:

    “
    

    所以你的问题不是 Java 代码没有生成 UTF-8,因为它是,而是你用来查看文件内容的任何工具都在 Windows-1252 中读取它。

    如果您使用 NotePad++ 之类的程序,则可以通过在 Encoding 下拉菜单中选择适当的选项来更改所使用的编码。

    仅供参考:Windows-1252 / ISO 8859-1 不支持笑脸,所以你不能使用它。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2014-09-02
      • 2016-08-24
      • 1970-01-01
      • 1970-01-01
      • 2011-01-07
      • 2014-07-18
      • 2010-10-04
      相关资源
      最近更新 更多