XLSX/CSV转TXT工具特殊字符乱码(问号)问题求助
解决XLSX/CSV转TXT时特殊字符丢失的问题
问题原因
你的代码在处理俄语、日语等非ASCII字符时出现问号,核心原因是读取文件或转换过程中编码处理不当,导致Unicode字符被错误转码。
修改方案
主要调整两个关键环节:文件读取的编码配置,以及确保转换后的字符串以UTF-8格式写入。
- 读取XLSX时指定UTF-8编码:在
xlsx.readFile中添加codepage: 65001参数(65001对应UTF-8编码),强制以UTF-8解析文件内容,避免字符转码错误。 - 明确写入文件的编码选项:将
fs.writeFileSync的编码参数改为对象格式{ encoding: 'utf8' },确保写入时严格使用UTF-8编码,消除参数解析歧义。 - 可选优化:直接使用
sheet_to_txt替代sheet_to_csv,跳过CSV中间格式转换,减少编码出错概率(你原本也要移除逗号,纯文本转换更贴合需求)。
完整修改后的代码
const fs = require('fs'); const xlsx = require('xlsx'); const xlsxFilePath = process.argv[2]; const txtFilePath = process.argv[3]; // 读取文件时指定UTF-8编码 const workbook = xlsx.readFile(xlsxFilePath, { codepage: 65001 }); const firstSheetName = workbook.SheetNames[0]; const worksheet = workbook.Sheets[firstSheetName]; // 直接转换为纯文本(替代CSV转换,更贴合需求) const txtData = xlsx.utils.sheet_to_txt(worksheet); // 移除仅含空白字符的行(原逻辑保留) const txtDataWithoutEmptyLines = txtData.replace(/^\s*[\r\n]/gm, ''); // 明确指定UTF-8编码写入文件 fs.writeFileSync(txtFilePath, txtDataWithoutEmptyLines, { encoding: 'utf8' });
关键说明
codepage: 65001:告知xlsx库以UTF-8编码解析文件,确保非ASCII字符被正确读取。sheet_to_txt:直接生成纯文本,无需处理CSV的逗号分隔符,减少不必要的转义操作。{ encoding: 'utf8' }:明确写入编码,避免Windows环境下Node.js默认编码(utf16le)导致的字符乱码。
内容的提问来源于stack exchange,提问作者Max Oliveira
相关产品推荐
相关产品推荐

