如何将XLSX解析CSV得到的\x80等Windows-1252编码字符转为可读字符串
问题根源
你遇到的问题本质是编码解析错误:原始文件是Windows-1252编码,其中0x80字节对应欧元符号,但你用SheetJS解析时没有指定编码,库默认按UTF-8/Unicode规则解析,把0x80直接映射成了Unicode的控制字符U+0080。Chrome对这类错误编码做了兼容处理自动转义,Safari、Firefox和MongoDB都严格遵循Unicode标准,所以无法正常识别。
解决方案
方案1:解析阶段直接指定编码(推荐)
在调用XLSX.read方法时直接指定编码为cp1252(Windows-1252的标准别名),从根源避免后续转码问题,所有特殊字符会自动解析为正确的Unicode格式:
const workbook = XLSX.read(fileBinaryData, { type: 'binary', encoding: 'cp1252' })
方案2:已解析字符串的通用转码
如果无法修改解析逻辑,可以用以下通用转换方法处理所有Windows-1252的特殊字符,无需逐个替换:
// Windows-1252 0x80-0x9F区间到Unicode的映射表 const cp1252SpecialMap = new Map([ [0x80, 0x20AC], [0x82, 0x201A], [0x83, 0x0192], [0x84, 0x201E], [0x85, 0x2026], [0x86, 0x2020], [0x87, 0x2021], [0x88, 0x02C6], [0x89, 0x2030], [0x8A, 0x0160], [0x8B, 0x2039], [0x8C, 0x0152], [0x8E, 0x017D], [0x91, 0x2018], [0x92, 0x2019], [0x93, 0x201C], [0x94, 0x201D], [0x95, 0x2022], [0x96, 0x2013], [0x97, 0x2014], [0x98, 0x02DC], [0x99, 0x2122], [0x9A, 0x0161], [0x9B, 0x203A], [0x9C, 0x0153], [0x9E, 0x017E], [0x9F, 0x0178] ]) function convertCp1252ToUnicode(str) { return str.split('').map(char => { const code = char.charCodeAt(0) if (code >= 0x80 && code <= 0x9F && cp1252SpecialMap.has(code)) { return String.fromCodePoint(cp1252SpecialMap.get(code)) } return char }).join('') } // 测试 const s = '\x80' console.log(convertCp1252ToUnicode(s)) // 全浏览器输出 €,存入MongoDB可正常识别
内容的提问来源于stack exchange,提问作者Bogy
相关产品推荐
相关产品推荐

