Android中UTF-8编码失效:CSV文件写入后被识别为windows-1252
解决CSV文件UTF-8编码显示异常的问题
嘿,我碰到过不少你这种情况——代码里明明指定了UTF-8写入CSV,日志也显示编码是UTF-8,但用桌面工具打开时却被识别成windows-1252,导致æøå这类特殊字符读不出来。这大概率是两个原因:UTF-8文件没加BOM标记,或者默认打开工具的编码识别逻辑搞事情,下面给你具体的解决办法:
1. 给UTF-8文件添加BOM(最直接的Windows兼容方案)
Windows上的记事本这类工具,默认会把没有BOM的UTF-8文件当成系统默认编码(也就是windows-1252)来解析。你只需要在写入实际数据前,先写入UTF-8的BOM字节就行:
// 先写入UTF-8 BOM,再创建Writer fOut.write(new byte[]{(byte)0xEF, (byte)0xBB, (byte)0xBF}); OutputStreamWriter myOutWriter = new OutputStreamWriter(fOut, StandardCharsets.UTF_8);
顺便说一句,用StandardCharsets.UTF_8比Charset.forName("UTF-8")更安全,还不用处理异常~
2. 手动指定打开工具的编码(跨平台友好)
如果不想加BOM(比如Linux/macOS下有些工具会把BOM当成文件内容的一部分),那打开文件时手动选UTF-8就行:
- 用Notepad++打开:顶部菜单栏点「编码」→「UTF-8」(别选带BOM的选项)
- 用Excel导入:在文本导入向导的第一步,把「文件原始编码」改成「UTF-8」
3. 验证文件的真实编码
你可以用工具确认文件到底是不是UTF-8:
- Linux/macOS终端:
file -i your_file.csv,输出里应该能看到charset=utf-8 - Windows PowerShell:
Get-Content your_file.csv -Encoding Byte | Select-Object -First 3,如果开头是239 187 191,说明有BOM;没有的话也能通过后续字节判断是不是UTF-8
从你的日志「BODY ENCODING: UTF-8」来看,代码里的Writer编码应该是没问题的,重点就在BOM和打开工具的识别上,试试上面的方法应该能解决~
内容的提问来源于stack exchange,提问作者Martin Lund
相关产品推荐
相关产品推荐

