提问人:theolaa 提问时间:6/19/2023 最后编辑:theolaa 更新时间:6/19/2023 访问量:71
为什么当我指定编码为 Cp1252 时,我的 BufferedWriter 可能会输出 UTF-8 文本文件?
Why might my BufferedWriter output a UTF-8 text file when I'm specifying that the encoding is Cp1252?
问:
我正在处理一些可能是 UTF-8 或 ANSI(特别是 Cp1252)的文件,我需要加载它们,进行一些编辑,然后使用原始编码再次输出文件。但是,我根本没有运气让我的程序输出 ANSI。
我用于加载文本的代码是一个简单的,带有指定的Scanner
charsetName
fileScanner = new Scanner(f, CHARACTER_SET);
我目前用于编写文件的代码如下:
BufferedWriter writer = new BufferedWriter(new OutputStreamWriter(new FileOutputStream(file), CHARACTER_SET));
writer.write(this.toString());
System.out.println("Writing " + name + " (" + method + ") using " + CHARACTER_SET + " encoding");
writer.close();
CHARACTER_SET
是一个字符串,它要么是“UTF8”,要么是“windows-1252”,具体取决于我在加载文件时检测到的文件的编码。
该文件实际上在这两种模式下都能正常输出,我遇到的所有特殊重音符号都没有损坏。问题是,如果我处理 Cp1252 文件,即使我使用 Cp1252 OutputStreamWriter 初始化了 BufferedWriter,它也会将其输出为 UTF-8。我可以验证这一点,因为编码是通过 设置的,然后我立即打印出来,显示对于 ANSI 文件,它使用了 Cp1252。我正在通过将输出加载到 Notepad++ 中并查看它在右下角的内容来检查输出的编码。CHARACTER_SET
CHARACTER_SET
它知道我似乎有点分裂头发,但我真的想让文件保留其原始编码。
答:
好吧,我不是 100% 确定这是如何工作的,但我将我的 write 语句更改为以下内容
writer.write(new String(this.toString().getBytes(Charset.forName(CHARACTER_SET))));
现在它起作用了。
我认为正在发生的事情是文件内容被正确加载,但随后被 Java 的内部 String 格式重新编码。为了让它以我想要的格式写入文件,我必须在打印之前将文本从 Java 的格式转换为 Cp1252,即使我最初将其加载为 Cp1252。
总之,问题似乎不在于加载文本或设置 BufferedWriter,而在于我告诉 BufferedWriter 编写的文本。
评论
this
toString()
this