写在前面

在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时,则出现了乱码。
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);
// ��
实际例子:服务端编解码
通常我们需要处理编解码的场景有文件读写、网络请求处理。这里距网络请求的例子,介绍如何在服务端进行编解码。
假设我们运行着如下http服务,监听来自客户端的请求。客户端传输数据时采用了gbk编码,而服务端默认采用的是utf8编码。
如果此时采用默认的utf8对请求进行解码,就会出现乱码,因此需要特殊处理。
服务端代码如下(为简化代码,这里跳过了请求方法、请求编码的判断)
var http = require('http');
var iconv = require('iconv-lite');
// 假设客户端采用post方法,编码为gbk
var server = http.createServer(function (req, res) {
var chunks = [];
req.on('data', function (chunk) {
chunks.push(chunk)
});
req.on('end', function () {
chunks = Buffer.concat(chunks);
// 对二进制进行解码
var body = iconv.decode(chunks, 'gbk');
console.log(body);
res.end('HELLO FROM SERVER');
});
});
server.listen(3000);
对应的客户端代码如下:
var http = require('http');
var iconv = require('iconv-lite');
var charset = 'gbk';
// 对字符"你"进行编码
var reqBuff = iconv.encode('你', charset);
var options = {
hostname: '127.0.0.1',
port: '3000',
path: '/',
method: 'POST',
headers: {
'Content-Type': 'text/plain',
'Content-Encoding': 'identity',
'Charset': charset // 设置请求字符集编码
}
};
var client = http.request(options, function(res) {
res.pipe(process.stdout);
});
client.end(reqBuff);
相关链接
Nodejs学习笔记:https://github.com/chyingp/nodejs-learning-guide
iconv-lite:https://github.com/ashtuchkin/iconv-lite
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持。
# Nodejs
# 字符编解码
# 乱码处理
# nodejs和C语言插入mysql数据库乱码问题的解决方法
# nodejs爬虫遇到的乱码问题汇总
# 解决nodejs中使用http请求返回值为html时乱码的问题
# nodejs爬虫抓取数据乱码问题总结
# 服务端
# 编解码
# 客户端
# 你好
# 的是
# 就会
# 采用了
# 转成
# 举个例子
# 都是
# 有很多
# 如何在
# 是由
# 而在
# 所需
# 下一
# 可在
# 英文
# 可以看到
# 告诉我们
相关文章:
建站之星如何实现PC+手机+微信网站五合一建站?
高性能网站服务器部署指南:稳定运行与安全配置优化方案
如何在建站之星网店版论坛获取技术支持?
极客网站有哪些,DoNews、36氪、爱范儿、虎嗅、雷锋网、极客公园这些互联网媒体网站有什么差异?
山东网站制作公司有哪些,山东大源集团官网?
免费ppt制作网站,有没有值得推荐的免费PPT网站?
高配服务器限时抢购:企业级配置与回收服务一站式优惠方案
如何在Windows虚拟主机上快速搭建网站?
标准网站视频模板制作软件,现在有哪个网站的视频编辑素材最齐全的,背景音乐、音效等?
如何快速选择适合个人网站的云服务器配置?
建站主机与虚拟主机有何区别?如何选择最优方案?
内网网站制作软件,内网的网站如何发布到外网?
建站ABC备案流程中有哪些关键注意事项?
建站之星如何开启自定义404页面避免用户流失?
北京网站制作公司哪家好一点,北京租房网站有哪些?
定制建站流程解析:需求评估与SEO优化功能开发指南
宝塔新建站点报错如何解决?
如何用西部建站助手快速创建专业网站?
赚钱网站制作软件,建一个网站怎样才能赚钱?是如何盈利的?
如何获取开源自助建站系统免费下载链接?
如何快速搭建自助建站会员专属系统?
网站图片在线制作软件,怎么在图片上做链接?
高防网站服务器:DDoS防御与BGP线路的AI智能防护方案
建站之星免费版是否永久可用?
C++中引用和指针有什么区别?(代码说明)
建站之星在线客服如何快速接入解答?
C#怎么使用委托和事件 C# delegate与event编程方法
网站制作哪家好,cc、.co、.cm哪个域名更适合做网站?
建站主机是什么?如何选择适合的建站主机?
济南企业网站制作公司,济南社保单位网上缴费步骤?
可靠的网站设计制作软件,做网站设计需要什么样的电脑配置?
如何在IIS中新建站点并配置端口与物理路径?
台州网站建设制作公司,浙江手机无犯罪记录证明怎么开?
香港服务器网站生成指南:免费资源整合与高速稳定配置方案
如何通过wdcp面板快速创建网站?
香港服务器网站卡顿?如何解决网络延迟与负载问题?
如何快速登录WAP自助建站平台?
广德云建站网站建设方案与建站流程优化指南
香港网站服务器数量如何影响SEO优化效果?
寿县云建站:智能SEO优化与多行业模板快速上线指南
如何高效利用200m空间完成建站?
Android自定义listview布局实现上拉加载下拉刷新功能
如何在腾讯云服务器上快速搭建个人网站?
如何通过IIS搭建网站并配置访问权限?
如何通过商城免费建站系统源码自定义网站主题?
制作网站哪家好,cc、.co、.cm哪个域名更适合做网站?
手机网站制作与建设方案,手机网站如何建设?
宝塔建站无法访问?如何排查配置与端口问题?
c++怎么使用类型萃取type_traits_c++ 模板元编程类型判断【方法】
如何选择域名并搭建高效网站?
*请认真填写需求信息,我们会在24小时内与您取得联系。