当前位置: 首页 > 后端技术 > Node.js

Nodejs进阶:服务器端字符编解码&乱码处理

时间:2023-04-03 10:51:14 Node.js

写的比较早在web服务器开发中,几乎每天都要和字符编解码打交道。一旦编解码处理不当,就会出现麻烦的乱码。很多从事节点服务器开发的同学,由于对字符编码编码知识的缺乏,遇到问题时往往无所适从,花费大量的时间去排查和解决问题。文中首先简单介绍了字符编解码的基础知识,然后给出了如何在node中进行编解码的例子,最后给出了服务端的代码示例。可以在此处找到本文的代码示例。关于字符编码和解码在网络通信过程中,无论发送的内容是文本还是图片,使用的语言是中文还是英文,都是以二进制比特来传输的。例如,客户端向服务器发送“Hello”。Client---Hello--->Server包含两个关键步骤,分别对应编码和解码。客户端:将字符串“Hello”编码成计算机网络需要的二进制位。服务器:将接收到的二进制位解码为字符串“Hello”。总结一下:编码:将要传输的数据转换成相应的二进制位。解码:将二进制位转换为原始数据。上面没有提到一些重要的技术细节,答案在下一节。客户端如何知道字符“Hello”对应的位数呢?服务器收到二进制位后,如何知道对应的字符串是什么?关于字符集和字符编码,上面提到的字符和二进制转换问题。由于两者可以相互转换,也就是说有明确的转换规则,可以实现字符<->二进制的相互转换。这里所说的转换规则,其实就是我们经常听到的字符集&字符编码。字符集是字符(文字字符、标点符号等)的集合。字符集有很多种,常见的有ASCII、Unicode、GBK等,不同字符集的主要区别在于包含的字符数。了解了字符集的概念之后,我们来介绍一下字符编码。字符集告诉我们支持哪些字符,但是具体字符如何编码是由字符编码决定的。例如Unicode字符集支持UTF8(常用)、UTF16、UTF32字符编码。总结一下:字符集:字符的集合,不同的字符集包含不同数量的字符。字符编码:字符在字符集中的实际编码方式。一个字符集可能有多种字符编码方式。字符编码可以看作一个映射表,客户端和服务器根据这个映射表进行字符和二进制的编解码转换。例如字符“you”在UTF8编码中占用三个字节0xe40xbd0xa0,在GBK编码中占用两个字节0xc40xe3。字符编解码示例字符编解码需要的基本知识上面已经讲过了。下面看一个简单的例子,我们使用库icon-lite来帮助我们实现编码和解码的操作。可以看出,在对字符进行编码时,我们使用的是gbk。解码的时候,如果也用gbk,就可以得到原来的字符。而当我们在解码的时候使用utf8,就会出现乱码。variconv=require('iconv-lite');varoriText='你';varencodedBuff=iconv.encode(oriText,'gbk');console.log(encodedBuff);//vardecodedText=iconv.decode(encodedBuff,'gbk');console.log(decodedText);//你的varwrongText=iconv.decode(encodedBuff,'utf8');console.log(wrongText);//实际例子:serviceSidecodec通常我们需要处理文件读写、网络请求处理等编解码场景。下面以网络请求为例,介绍如何在服务器端进行编码和解码。假设我们正在运行以下http服务,监听来自客户端的请求。客户端传输数据时使用gbk编码,而服务端默认使用utf8编码。如果此时使用默认的utf8解码请求,会出现乱码,需要特殊处理。服务端代码如下(为了简化代码,此处略过请求方式和请求编码的判断)varhttp=require('http');variconv=require('iconv-lite');//假设客户端使用post方法,编码为gbkvarserver=http.createServer(function(req,res){varchunks=[];req.on('data',function(chunk){chunks.push(chunk)});req.on('end',function(){chunks=Buffer.concat(chunks);//解码二进制varbody=iconv.decode(chunks,'gbk');console.log(body);res.end('HELLOFROMSERVER');});});server.listen(3000);对应的客户端代码如下:varhttp=require('http');variconv=require('iconv-lite');varcharset='gbk';//编码字符“you”varreqBuff=iconv.encode('you',charset);varoptions={hostname:'127.0.0.1',port:'3000',path:'/',method:'POST',headers:{'Content-Type':'text/plain','Content-Encoding':'identity','Charset':charset//设置请求字符集编码}};varclient=http.request(options,function(res){res.pipe(process.stdout);});client.end(req浅黄色);相关链接Nodejs学习笔记https://github.com/chyingp/no...iconv-litehttps://github.com/ashtuchkin...

猜你喜欢