java - 从文件转换 UTF-8 读取 unicode 行

标签 java unicode utf-8 character-encoding

我正在读取一个文件,其中文本中包含 unicode 转义序列,示例如下:

\u201c@hannah_hartzler: In line for the gate keeper! @nerk97 @ShannonWalkup\u201d\ud83d\ude0d\ud83d\ude0d\ud83d\ude0d\ud83d\ude0d\u2764\u2764\u2764

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

“@hannah_hartzler: In line for the gate keeper! @nerk97 @ShannonWalkupâ€ðŸ˜ðŸ˜ðŸ˜ðŸ˜â¤â¤â¤

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

“@hannah_hartzler: In line for the gate keeper! @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);

最佳答案

当您通过 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.*;)

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

关于java - 从文件转换 UTF-8 读取 unicode 行,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33351424/

相关文章:

java - 无法连接到 sftp : com. jcraft.jsch.JSchException:算法协商失败

Perl-文件编码和单词比较

python - 具有适当 unicode 支持的图表

unicode - Python 3 UnicodeEncodeError : 'ascii' codec can't encode characters

python 2.7 : output utf-8 in Windows console

applet - 如何为浏览器小程序指定特定的 JRE?

java - Android、Spring 和 Json 一般问题?

java - 原因 ERROR 递归调用 appender。有办法解决吗?

html - 在 HTML/CSS 网站上显示复制/粘贴的 Arduino 代码

php - PHP中UTF-8编码的问题