JVM默认file.encoding为Cp1252,生成文件却为ISO-8859-1的原因
为什么JVM显示编码是Cp1252,但生成的文件被识别为ISO-8859-1?
这其实是个很容易踩的编码认知坑,我给你一步步理清楚:
Cp1252和ISO-8859-1的本质关系
Cp1252是ISO-8859-1(也叫Latin-1)的超集——它完全包含了ISO-8859-1的所有字符,还额外添加了一批特殊字符(比如智能引号「“”」、欧元符号「€」、省略号「…」等)。但如果你的文件里只用到了ISO-8859-1覆盖的字符(比如基础英文字母、数字、普通标点),file -i这类检测工具根本没法区分两者,只会返回更通用的ISO-8859-1标识。FileWriter的实际编码行为
你用FileWriter写文件时,确实是遵循JVM的file.encoding配置(也就是Cp1252)来编码的。只是因为写入的内容没有触发Cp1252的独有字符,工具无法识别出它是更“扩展”的Cp1252,只能给出最基础的兼容结果。验证方法
你可以试着往文件里写入一个Cp1252独有的字符(比如欧元符号€),再用file -i检测,这时候工具应该就会明确识别为Cp1252了——因为这个字符不在ISO-8859-1的字符集中,能直接区分两者。额外建议:避免编码歧义
如果想要彻底避免这种识别模糊的问题,建议不要依赖FileWriter的默认编码,而是用OutputStreamWriter手动指定编码,代码示例:bf = new BufferedWriter(new OutputStreamWriter(new FileOutputStream(file), "Cp1252"));这样不管写入什么内容,文件的编码都是明确可控的,也能减少工具识别的误差。
内容的提问来源于stack exchange,提问作者Trang Nguyen
相关产品推荐
相关产品推荐

