java 当我指定编码为Cp 1252时,为什么BufferedWriter会输出UTF-8文本文件?

t2a7ltrp  于 2023-06-20  发布在  Java
关注(0)|答案(1)|浏览(147)

我正在处理一些可能是UTF-8或ANSI(特别是Cp 1252)的文件,我需要加载它们,进行一些编辑,然后使用原始编码再次输出文件。然而,我还没有任何运气让我的程序输出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”,这取决于我在加载文件时检测到的编码。
文件实际上在两种模式下都能正常输出,我遇到的所有特殊重音字符都没有损坏。问题是,如果我处理一个Cp 1252文件,即使我用Cp 1252 OutputStreamWriter初始化BufferedWriter,它也会将其输出为UTF-8。我可以验证这一点,因为编码是通过CHARACTER_SET设置的,然后我打印出CHARACTER_SET,显示对于ANSI文件,它使用Cp 1252。我通过将输出加载到Notepad++中来检查其编码,并查看右下角显示的内容。
它知道似乎我分裂头发有点,但我真的想离开的文件与其原始编码。

s3fp2yjn

s3fp2yjn1#

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

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

现在成功了
我认为发生的事情是,文件内容被正确加载,但随后被Java的内部String格式重新编码。为了让它以我想要的格式写入文件,我必须在打印之前将文本从Java格式转换为Cp1252,尽管我最初加载的是Cp1252。
总之,问题似乎不是加载文本或设置BufferedWriter,而是我告诉BufferedWriter编写的文本。

相关问题