为什么当我指定编码为 Cp1252 时,我的 BufferedWriter 可能会输出 UTF-8 文本文件?

Why might my BufferedWriter output a UTF-8 text file when I'm specifying that the encoding is Cp1252?

提问人:theolaa 提问时间:6/19/2023 最后编辑:theolaa 更新时间:6/19/2023 访问量:71

问:

我正在处理一些可能是 UTF-8 或 ANSI(特别是 Cp1252)的文件,我需要加载它们,进行一些编辑,然后使用原始编码再次输出文件。但是,我根本没有运气让我的程序输出 ANSI。

我用于加载文本的代码是一个简单的,带有指定的ScannercharsetName

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_SETCHARACTER_SET

它知道我似乎有点分裂头发,但我真的想让文件保留其原始编码。

Java 编码 UTF-8 文件写入 CP1252

评论

0赞 theolaa 6/19/2023
无论我使用 java.io 名称还是 java.nio 名称(对于这两种编码),它的行为方式都完全相同。
1赞 Reilas 6/19/2023
你用什么来读取数据,你能添加该代码吗?
0赞 President James K. Polk 6/19/2023
什么是,请展示该类的方法。thistoString()
0赞 theolaa 6/19/2023
@Reilas 我已经用该信息更新了问题
0赞 theolaa 6/19/2023
@PresidentJamesK.Polk 是一个表示自定义数据结构的类。它的 toString() 方法序列化它并将其作为 String 返回。this

答:

0赞 theolaa 6/19/2023 #1

好吧,我不是 100% 确定这是如何工作的,但我将我的 write 语句更改为以下内容

writer.write(new String(this.toString().getBytes(Charset.forName(CHARACTER_SET))));

现在它起作用了。

我认为正在发生的事情是文件内容被正确加载,但随后被 Java 的内部 String 格式重新编码。为了让它以我想要的格式写入文件,我必须在打印之前将文本从 Java 的格式转换为 Cp1252,即使我最初将其加载为 Cp1252。

总之,问题似乎不在于加载文本或设置 BufferedWriter,而在于我告诉 BufferedWriter 编写的文本。