我正在读取一个文件,其中文本中包含 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/