【发布时间】:2019-12-11 21:22:11
【问题描述】:
我正在读取带有重音字符的 UTF-8 输入文件,读取这些行并将它们写回另一个文件(也是 UTF-8),但重音字符在输出中出现乱码。例如以下单词:
莱昂
马诺亚
输出为:
Le�n
马诺阿
我已经查看了这个问题的大约 100 个答案,这些答案都建议按照下面的代码所示读取和写入文件,但我一直得到相同的结果。
我已将代码分解为以下基本功能:
public class UTF8EncoderTest
{
public static void main(String[] args)
{
try
{
BufferedReader inputFileReader = new BufferedReader(new InputStreamReader(new FileInputStream("utf8TestInput.txt"), "UTF-8"));
BufferedWriter outputFileWriter = new BufferedWriter(new OutputStreamWriter(new FileOutputStream("utf8TestOutput.txt"), "UTF-8"));
String line = inputFileReader.readLine();
while (line != null)
{
outputFileWriter.write(line + "\r\n");
line = inputFileReader.readLine();
}
inputFileReader.close();
outputFileWriter.close();
System.out.println("Finished!");
}
catch (IOException e)
{
e.printStackTrace();
}
}
}
但这仍然会导致输出文件中出现乱码。任何帮助将不胜感激!
【问题讨论】:
-
请search Stackoverflow for this:我可以保证答案已经在这里了。
-
如问题中所述,我已经在 StackOverflow 上搜索了这个问题的答案,他们都给出了相同的答案,即上面编码的内容。 BufferedReader inputFileReader = new BufferedReader(new InputStreamReader(new FileInputStream("utf8TestInput.txt"), "UTF-8"));和 BufferedWriter outputFileWriter = new BufferedWriter(new OutputStreamWriter(new FileOutputStream("utf8TestOutput.txt"), "UTF-8"));
-
您能否提供您正在测试的输入和输出文件的原始十六进制转储?
-
那么可以合理地假设您正在阅读的内容实际上根本不是 UTF-8。输入文件中的前几个字节是什么?
-
León在 UTF-8 中是字节4C 65 C3 B3 6E。 UTF-8 中的Le�n是字节4C 65 EF BF BD 6E。EF BF BD是 Unicode 代码点U+FFFD REPLACEMENT CHARACTER的 UTF-8 编码形式。无论输入字符串León编码的字节是什么,它都不是UTF-8,导致您的InputStreamReader误解ó(代码点U+00F3)并将其替换为line变量中的代码点U+FFFD ,然后您的OutputStreamWriter(正确地)以字节EF BF BD用UTF-8 写出。所以仔细检查输入文件的编码,它不是你想象的那样。
标签: java utf-8 fileoutputstream bufferedwriter