如何在Node.js中通过require调用windows-1252模块解决编码乱码问题
解决方案
1. 编码乱码&文件识别错误修复
你的转码逻辑属于多余的错误操作,核心原因如下:
data.response.stream本身就是接口返回的原生UTF-8格式Buffer,你做的「转字符串→cp1252编码→UTF-8解码」流程会破坏原有正确编码,导致出现�替换字符fs.writeFileSync是同步写入方法,你错误传入了仅异步方法才用的回调函数,且没有指定写入编码,Windows环境下Node.js会默认用系统cp1252编码写入,导致记事本识别为ASCII编码
不需要引入任何第三方转码库,直接写入原始Buffer即可,想要让Windows记事本正确识别为UTF-8,可以额外加UTF-8 BOM头。
2. 模块引入报错修复
你遇到的require/import报错是因为windows-1252新版本为纯ES模块,仅支持import语法,和你项目使用的CommonJS规范不兼容。直接移除所有转码相关依赖(iconv、iconv-lite、utf8、windows-1252等)即可解决该问题,本身也不需要这些依赖。
修正后完整代码
const newman = require('newman'); const fs = require('fs'); const path = require('path'); // 提前创建results目录避免写入报错 const resultsDir = './results'; if (!fs.existsSync(resultsDir)) { fs.mkdirSync(resultsDir, { recursive: true }); } let pageNumber = 16287; // UTF-8 BOM头,用于让Windows记事本正确识别编码 const UTF8_BOM = Buffer.from([0xEF, 0xBB, 0xBF]); newman.run({ collection: require('./postman-collection.json'), iterationData: './iteration-data.csv', color: 'on', verbose: 'on', exportCollection: './after_pmRuns', delayRequest: 500, environment: require('./postman-environment.json'), reporters: 'cli', }).on('request', (error, data) => { if (error) { console.log(error); return; } console.log('Request name: ' + data.item.name); // 直接打印原始UTF-8内容 console.log(data.response.stream.toString('utf8')); const currentPageNumber = pageNumber++; const requestName = data.item.name.replace(/[^a-z0-9]/gi, '-'); const randomString = Math.random().toString(36).substring(7); const fileName = path.join(resultsDir, `_00${currentPageNumber}-response-${requestName}-${randomString}.json`); // 拼接BOM头和原始响应Buffer直接写入,不需要任何转码 const fileContent = Buffer.concat([UTF8_BOM, data.response.stream]); fs.writeFileSync(fileName, fileContent); console.log(`文件已写入:${fileName}`); });
内容的提问来源于stack exchange,提问作者David Saint
相关产品推荐
相关产品推荐

