使用错误编码读取文件。CP1252与UTF-8之争。

3

我有一个字节数组,将其放入InputStreamReader中并对其进行一些操作。

Reader reader = new InputStreamReader(new ByteArrayInputStream(byteArr));

JVM默认使用cp1252编码,但是我要转换为字节数组的文件使用的是utf-8编码。同时这个文件中包含了德文umlauts字符。当我将该字节数组放入InputStreamReader时,Java会将umlauts字符解码为错误的符号。例如,ü被表示为ü。我尝试在InputStreamReader构造函数中加入"UTF-8"和Charset.forName("UTF-8").newDecoder(),并通过new String(oldStr.getBytes("cp1252"), "UTF-8)使用新编码从读取器中转换字符串,但这没有帮助解决问题。在调试器中,我发现读取器变量中有StreamDecoder参数,它具有MS1252$Decoder值。也许这可以解决我的问题,但我不知道如何修复它。

2个回答

3
尝试使用InputStreamReader(InputStream in, String charsetName)构造函数,并自行设置字符集。
Reader reader = new InputStreamReader(new ByteArrayInputStream(byteArr), "UTF-8");

也许OpenCSV会损坏文件。当我获取Reader时,我将其放入OpenCSV解析方法中。例如,只有一个单词“Zurückziehung”的文件,但输出结果却是“ZurÃckziehung”。 - Evgeny Mironenko
我使用 ANSI 编码没有问题,但我需要使用 UTF-8。 - Evgeny Mironenko
这不是解决方案,我做了同样的操作:我使用“UTF-8”编码创建InputStreamReader,并将其放入CSVReader中。 - Evgeny Mironenko
也许你的 .txt 文件不是 UTF-8 编码的?我找不到其他解释。 - Pavlo K.
看起来你的文件是在cp1252编码下,而你试图在UTF-8编码下读取和操作它。 - Pavlo K.
显示剩余6条评论

1

我曾经遇到过完全相同的错误,最终通过将以下内容添加到JVM启动选项中解决了该问题:

-Dfile.encoding=UTF8

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接