如何将CSV文件编码转换为ISO-8859-1(ISO-Latin-1)?
解决CSV转ISO-8859-1编码时特殊字符丢失的问题
核心问题根源
你之前用的text-encoding、PapaParse这类工具都是先把文件解析成Unicode文本,再转编码——但ISO-8859-1是单字节编码,像ä、ö、ü这类特殊字符在Unicode转ISO的过程中,若经过不必要的文本解析步骤,会被替换成乱码。正确的做法是跳过文本解析,直接操作原始字节流,确保字符的编码字节完全匹配ISO-8859-1标准。
可行解决方案
1. Node.js脚本(本地/后端)
用iconv-lite直接处理字节,避免Unicode转换损耗:
const fs = require('fs'); const iconv = require('iconv-lite'); // 读取UTF-8格式的CSV,转成ISO-8859-1字节后写入 const inputBytes = fs.readFileSync('input.csv'); const isoBytes = iconv.encode(inputBytes.toString('utf8'), 'iso-8859-1'); fs.writeFileSync('output_iso.csv', isoBytes);
如果原文件是其他编码(比如Windows-1252),把utf8换成对应编码即可。
2. 浏览器端处理
用FileReader读取文件的ArrayBuffer,直接生成ISO-8859-1编码的Blob下载:
function convertAndDownloadISO(file) { const reader = new FileReader(); reader.onload = (e) => { const uint8Array = new Uint8Array(e.target.result); const isoBlob = new Blob([uint8Array], { type: 'text/csv; charset=ISO-8859-1' }); const downloadLink = document.createElement('a'); downloadLink.href = URL.createObjectURL(isoBlob); downloadLink.download = `${file.name.split('.')[0]}_iso.csv`; downloadLink.click(); }; reader.readAsArrayBuffer(file); }
如果原文件是UTF-8,需引入iconv-lite的浏览器版本,先把UTF-8文本转成ISO字节再生成Blob。
3. 本地无编程工具
- Python快速转换:
import codecs with codecs.open('input.csv', 'r', 'utf-8') as infile: content = infile.read() with codecs.open('output_iso.csv', 'w', 'iso-8859-1') as outfile: outfile.write(content)
- Linux/macOS命令行:
iconv -f UTF-8 -t ISO-8859-1 input.csv > output_iso.csv
- Windows PowerShell:
Get-Content input.csv -Encoding UTF8 | Set-Content output_iso.csv -Encoding Default
(Windows默认编码兼容ISO-8859-1,多数软件能正常读取)
关键提醒
ä、ö、ü这类字符本身属于ISO-8859-1的覆盖范围,只要避免中间的Unicode转换步骤,就能完美保留原有字符。
内容的提问来源于stack exchange,提问作者Markus Franzen
相关产品推荐
相关产品推荐

