Node.js 中文乱码解决

Node.js 支持中文不太好(实际上是Javascript支持),见《Node.js开发指南》。
要想Node.js正常显示中文,需要两点:
1、js文件保存为unicode格式。js文件是否为unicode格式,一个简单的方法是使用记事本来判断。使用记事本打开JS文件,点菜单另存为,看编码格式是否为"UTF-8"。若不是,可使用UltraEdit工具进行转换,使用记事本也可以转换。
2、在js文件中增加编码说明meta数据,让浏览器知道使用什么编码来解释网页。

两个条件缺一不可。

一个Node.js中使用中文的例子如下,该app.js需保存为utf-8格式,同时在文中增加meta编码数据说明:

<meta charset="utf-8"/>
//app.js 
 
var http = require('http');
 
http.createServer(function(req, res) {
  res.writeHead(200, {'Content-Type': 'text/html'});
  res.write('<head><meta charset="utf-8"/></head>');
  res.write('<h1>Node.js</h1>');
  res.write('<b>亲爱的,你慢慢飞,小心前面带刺的玫瑰...</b>');
  res.end('<p>Hello World</p>');
  
}).listen(3000);
 
console.log("HTTP server is listening at port 3000.");

NodeJS环境中使用GBK编码
Node默认支持的编码格式

Node中的Buffer对象支持以下编码(以6.9.1版本为例):参考API[https://npm.taobao.org/mirrors/node/latest/docs/api/buffer.html#buffer_buffers_and_character_encodings]

  • ascii :7-bit ASCII data,舍弃高位
  • utf8 : 多字节编码,大多数情况下String的默认编码格式
  • utf16le : 2或4字节编码
  • base64 : BASE64
  • latin1 (别名 binary): 单字节编码( A way of encoding the Buffer into a one-byte encoded string (as defined by the IANA in RFC1345, page 63, to be the Latin-1 supplement block and C0/C1 control codes))
  • binary : latin1的别名
  • hex : 单字节编码,用2位十六进制数字编码一个字节
    GBK与UTF-8

简单说一个是国家标准(GB)、一个是国际标准
GBK是我国颁布的一种汉字编码,作为一个体系,其前身是GB2312,后来演进为GB18030。这个系列的编码标准致力于解决中国国内面临的文字的编码问题,支持的语言包括中文汉字(简体)、日语、韩语、藏文、蒙文、维吾尔文等,主要还是中文。常见汉字用两个字节编码。
UTF-8是一种国际标准,同一个体系的还有UTF-16等。UTF-8致力于解决地球上全部文字的编码表示问题,除了东亚文字还包括其他语言的编码,如波斯文。其编码一个文字采用两个或三个字节。

一个常用汉字占用的字节数:
GB2312:2字节,GBK:2字节,GB18030:2字节,UTF-8:3字节
稀有的汉字:
GB2312: 不包含, GBK:包含,GB18030:包含,UTF-8:包含
特别稀有的汉字:
GB2312: 不包含, GBK:不包含,GB18030:包含,UTF-8:不包含

两种编码同时存在,且会长期共存。同一个系统内部尽量不要混用。
使用iconv-lite做编码转换

Node环境下处理汉字编码常用的有iconv和iconv-lite,前者使用二进制库实现,后者纯JS实现(性能上后者略好【没有实际测试】),这里只介绍iconv-lite[https://npm.taobao.org/package/iconv-lite]
iconv-lite支持的编码格式包括:

  • 所有node.js原生支持的编码: utf8, ucs2 / utf16-le, ascii, binary, base64, hex.
  • 其他unicode编码: utf16, utf16-be, utf-7, utf-7-imap.
  • 所有常见单字节编码:Windows 125x系列, ISO-8859系列, IBM/DOS codepages, Macintosh系列, KOI8系列, 其他iconv库支持的编码. 支持latin1, us-ascii这类别名.
  • 所有常见多字节编码: CP932, CP936, CP949, CP950, GB2313, GBK, GB18030, Big5, Shift_JIS, EUC-JP.

官方给出的例子:

var iconv = require('iconv-lite');
str = iconv.decode(new Buffer([0x68, 0x65, 0x6c, 0x6c, 0x6f]), 'win1251');
buf = iconv.encode("Sample input string", 'win1251');

也支持Stream方式使用,参见https://npm.taobao.org/package/iconv-lite

对于早期版本的Node,可以通过extendNodeEncodings在不影响代码结构的情况下扩展Node各原生接口支持的编码种类;这种方式在较新版本(v4+)已经废弃无法使用.

给出一个从GBK文件读取内容,然后编码转存为UTF-8编码的例子

```handlebars
var buffer = Buffer.from(fs.readFileSync('gbkFile.txt',{encoding:'binary'}),'binary');
console.log(buffer);//得到文件内容对应的Buffer
var text = iconv.decode(buffer,'GBK');//使用GBK解码
console.log(text);
//console.log(iconv.encode(text, 'utf8'));
//console.log(iconv.encode(text, 'gbk'));
fs.writeFileSync('utfFile.txt',iconv.encode(text, 'utf8'),'binary'); //按二进制方式写入
fs.writeFileSync('utfFile2.txt',text,'utf8'); //按UTF8写入


  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Node.js解决中文乱码问题可以通过设置正确的编码格式来解决。一种解决方法是在服务器发送数据时,正确告诉浏览器发送的内容是UTF-8编码的,可以通过设置响应头中的Content-Type来实现这一点。例如,可以使用res.setHeader('Content-Type', 'text/html; charset=utf-8')来设置编码格式为UTF-8。这样浏览器在解析服务器响应内容时就知道了正确的编码格式,从而避免乱码问题。另外,在调用res.end()方法向客户端发送中文内容时,也需要手动设置内容的编码格式,可以使用res.setHeader('Content-Type', 'text/html; charset=utf-8')来设置响应头,以确保中文内容能够正确显示。这样就可以解决Node.js中文乱码问题了。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* [Node.js抓取中文网页乱码问题和解决方法](https://download.csdn.net/download/weixin_38664556/13036279)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_1"}}] [.reference_item style="max-width: 33.333333333333336%"] - *2* [解决Node.js 运行的时候出现中文乱码问题](https://blog.csdn.net/m0_46374969/article/details/119273003)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_1"}}] [.reference_item style="max-width: 33.333333333333336%"] - *3* [NODE.js解决中文乱码问题](https://blog.csdn.net/LWKAY/article/details/120612343)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_1"}}] [.reference_item style="max-width: 33.333333333333336%"] [ .reference_list ]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值