前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >Nodejs进阶:服务端字符编解码&乱码处理

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

作者头像
用户1097444
发布2022-06-29 15:48:05
1.1K0
发布2022-06-29 15:48:05
举报
文章被收录于专栏:腾讯IMWeb前端团队

陈映平

云汉金融科技前端负责人,前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空间,以及所有帮助宣传的团队媒体和个人。

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

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2017-09-13,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 腾讯IMWeb前端团队 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 写在前面
  • 关于字符编解码
  • 关于字符集和字符编码
  • 字符编解码例子
相关产品与服务
云直播
云直播(Cloud Streaming Services,CSS)为您提供极速、稳定、专业的云端直播处理服务,根据业务的不同直播场景需求,云直播提供了标准直播、快直播、云导播台三种服务,分别针对大规模实时观看、超低延时直播、便捷云端导播的场景,配合腾讯云视立方·直播 SDK,为您提供一站式的音视频直播解决方案。
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档