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

2022-06-29 15:48:05 浏览数 (1)

陈映平

云汉金融科技前端负责人,前IMWEB团队成员,专注前端技术与架构设计

写在前面

在web服务端开发中,字符的编解码几乎每天都要打交道。编解码一旦处理不当,就会出现令人头疼的乱码问题。

不少从事node服务端开发的同学,由于对字符编码码相关知识了解不足,遇到问题时,经常会一筹莫展,花大量的时间在排查、解决问题。

文本先对字符编解码的基础知识进行简单介绍,然后举例说明如何在node中进行编解码,最后是服务端的代码案例。本文相关代码示例可在这里找到。

关于字符编解码

在网络通信的过程中,传输的都是二进制的比特位,不管发送的内容是文本还是图片,采用的语言是中文还是英文。

举个例子,客户端向服务端发送"你好"。

客户端 --- 你好 ---> 服务端

这中间包含了两个关键步骤,分别对应的是编码、解码。

  1. 客户端:将"你好"这个字符串,编码成计算机网络需要的二进制比特位。
  2. 服务端:将接收到的二进制比特位,解码成"你好"这个字符串。

总结一下:

  1. 编码:将需要传送的数据,转成对应的二进制比特位。
  2. 解码:将二进制比特位,转成原始的数据。

上面有些重要的技术细节没有提到,答案在下一小节。

  • 客户端怎么知道"你好"这个字符对应的比特位是多少?
  • 服务端收到二进制比特位之后,怎么知道对应的字符串是什么?

关于字符集和字符编码

上面提到字符、二进制的转换问题。既然两者可以互相转换,也就是说存在明确的转换规则,可以实现字符<->二进制的相互转换。

这里提到的转换规则,其实就是我们经常听到的字符集&字符编码。

字符集是一系列字符(文字、标点符号等)的集合。字符集有很多,常见的有ASCII、Unicode、GBK等。不同字符集主要的区别在于包含字符个数的不同。

了解了字符集的概念后,接下来介绍下字符编码。

字符集告诉我们支持哪些字符,但具体字符怎么编码,是由字符编码决定的。比如Unicode字符集,支持的字符编码有UTF8(常用)、UTF16、UTF32。

概括一下:

  • 字符集:字符的集合,不同字符集包含的字符数不同。
  • 字符编码:字符集中字符的实际编码方式。
  • 一个字符集可能有多种字符编码方式。

可以把字符编码看成一个映射表,客户端、服务端就是根据这个映射表,来实现字符跟二进制的编解码转换。

举个例子,"你"这个字符,在UTF8编码中,占据三个字节0xe4 0xbd 0xa0,而在GBK编码中,占据两个字节0xc4 0xe3

字符编解码例子

上面已经提到了字符编解码所需的基础知识。下面我们看一个简单的例子,这里借助了icon-lite这个库来帮助我们实现编解码的操作。

可以看到,在字符编码时,我们采用了gbk。在解码时,如果同样采用gbk,可以得到原始的字符。而当我们解码时采用utf8时,则出现了乱码。

代码语言:javascript复制
var iconv = require('iconv-lite');
var oriText = '你';
var encodedBuff = iconv.encode(oriText, 'gbk');
console.log(encodedBuff);
// <Buffer c4 e3>

var decodedText = iconv.decode(encodedBuff, 'gbk');
console.log(decodedText);
// 你

var wrongText = iconv.decode(encodedBuff, 'utf8');
console.log(wrongText);
// ��

          在本周六的IMWebConf 2017前端大会中, 本文作者陈映平将为大家带来WebAssembly:面向未来的web开发主题分享!想了解WebAssembly或者接触大神的小伙伴们,不要错过哦~

WebAssembly作为一种新的面向web的二进制格式,从设计之初,就以其高效和可移植性吸引了众多开发者的关注。本次分享将对WebAssembly进行总览性的介绍,同时结合当下开发实践,展望WebAssembly的未来。

IMWebConf最后一天购票狂欢

现场票:最后一天狂欢价399元,与大师零距离接触线上票150元,在家即可观看全部直播、录播视频

       IMWebConf 2017前端大会的发起方是腾讯公司,组织者是腾讯公司最专业的前端团队之一IMWeb团队。作为国内前端圈一年一度的,有一定影响力的专业前端技术交流大会,IMWebConf已经成功举办五届,累计探讨的议题超过上百个,线上线下参会者数千人,累计影响前端爱好者超过数十万人。

       今年,IMWebConf 2017 将于2017年9月16日深圳科兴国际会议中心召开。会议时间为一天,议题涵盖前端工程化、性能优化、Node.js、前端框架、安全等前沿方向。大会将设一个主会场和三个分会场(Node.js分会场、框架工具性能分会场、综合分会场)。

      本次大会,除了腾讯内部的前端技术分享,我们还有幸邀请到了W3C、微软、Facebook、Google、阿里等国内外知名IT行业的前端大咖,用最接地气的实践视角,以最高大上的思维方式,为您展现一个立体而丰富的前端体验之旅。


您殚精竭力想要的技术资料,在演讲分享中,就能轻易获得!

您百思不解的问题,在与技术大神的对话中,就会灵光乍现迎刃而解!

您想要接触的技术公司,在大会的现场也能轻松遇到!

不管你选择来现场,还是坐在家中看直播、看录播,你的要求都可以被满足!

报名请长按二维码或点击文末阅读原文,前往大会官网了解详情和购票:

2017.imweb.io

感谢本次会议的王者赞助商:腾讯课堂

感谢直播技术提供方:IT大咖说

感谢钻石赞助商(排名不分先后):100offer、WeTest、轩辕传奇、图灵教育、人民邮电出版社

感谢其他所有的合作伙伴(排名不分先后):HTML5梦工厂、开源中国、SegmentFault、前端圈、W3Cplus、前端早读课、WeX5、掘金、W3Cschool

感谢所有的合作媒体(排名不分先后):Stuq、GitChat、React-China、CSDN、Coding、伯乐在线、V2EX、活动行、腾讯大学、腾讯学院、腾讯研究院、QQ空间,以及所有帮助宣传的团队媒体和个人。

点击“阅读原文”了解更多大会信息,购买超值现场票、线上直播票!

0 人点赞