NodeJS笔记:处理非utf8编码

摘要:
实际上,如果不传encoding参数,返回的结果是一个Buffer类型的对象;如果传入参数,返回的是buffer.toString的结果,也就是对一个buffer编码的结果。纯Javascript是Unicode友好的但对于处理二进制数据并不合适。现在已经知道encoding参数实际上是交给Buffer.toString方法来处理的。希望Buffer.toString在不久的将来也能原生支持gbk编码。因为Buffer.prototype.toString不支持GBK,所以暂时还没办法把一个UTF8编码的网页下载下来编码成GBK字符串写入DB或者输出到控制台。Javascript里的字符串只支持UTF8编码,Iconv只在Buffer层做编码转换。

最近研究了下nodejs读写GBK文件的方法,nodejs原生的API接口如

fs.readFile(filename,[encoding],[callback])

其encoding参数是不支持gbk的。实际上,如果不传encoding参数,返回的结果是一个Buffer类型的对象;如果传入参数,返回的是buffer.toString(encoding)的结果,也就是对一个buffer编码的结果。纯Javascript是Unicode友好的但对于处理二进制数据并不合适。Buffer对象就是为了解决这个问题,我理解Buffer为固定长度的字节数组。现在已经知道encoding参数实际上是交给Buffer.toString方法来处理的。希望Buffer.toString在不久的将来也能原生支持gbk编码。从字节流转换到特定的一种字符编码,我想这应该只是时间问题。

虽然nodejs API不支持GBK字符串,但iconv这个nodejs插件模块却提供了类似的功能。来看看它的示例:

var gbk_to_utf8 = new Iconv('GBK', 'UTF8');

var buffer = gbk_to_utf8.convert(fs.readFileSync('path/to/gbkencodefile'));

console.log(buffer.toString());

构造函数接收两个encoding参数,标识编码转换规则。Iconv实例的convert方法接收一个buffer参数,按Iconv实例的规则进行转换。一般来说,只有buffer里的字节数组能被Iconv实例的fromEncoding正确解码,才能转换到正确的targetEncoding。例如网页爬虫,得事先解析页面的头部,通过"Content-Type"或"charset"得到源编码,再构造一个从源编码到目标编码的Iconv实例,才能得到想要的正确编码的目标数据。因为Buffer.prototype.toString(encoding)不支持GBK,所以暂时还没办法把一个UTF8编码的网页下载下来编码成GBK字符串写入DB或者输出到控制台。Javascript里的字符串只支持UTF8编码,Iconv只在Buffer层做编码转换。

Iconv是C++编写的node插件,暂时只能在linux环境编译出来,所以在windows下还不能使用。不过从v0.6.0版本做出的对windows的原生支持的努力来看,将来nodejs插件应该也会慢慢支持windows平台。

免责声明:文章转载自《NodeJS笔记:处理非utf8编码》仅用于学习参考。如对内容有疑问,请及时联系本站处理。

上篇加密通讯协议SSL编程周立发VUE.js全局变量的定义下篇

宿迁高防,2C2G15M,22元/月;香港BGP,2C5G5M,25元/月 雨云优惠码:MjYwNzM=

相关文章

前缀树及C++实现

文章   目录     1、什么是Trie树     2、树的构建与查询     3、Trie树的应用     4、C++实现Trie树以及解决一些字符串问题 前缀树 1 什么是Trie树   Trie树,即前缀树,又称单词查找树,字典树,是一种树形结构,是一种哈希树的变种。典型应用是用于统计和排序大量的字符串(但不仅限于字符串),所以经常被搜索引擎系...

‎Cocos2d-x 学习笔记(15.1) EventDispatcher

EventDispatcher对监听器进行管理,围绕着监听器工作。可以添加、删除、暂停/恢复监听器、分发事件到监听器。 1. 一些成员 /** 把ListenerID和同ID监听器的容器对应 */ std::unordered_map<EventListener::ListenerID, EventListenerVector*>...

python字符编码、字符串格式化、字符串方法、列表、元组、字典、集合等基础知识总结

目录: 一、字符编码 二、字符串格式化 三、进制转换 四、数据类型及其操作 1.int类、2.str类 五、格式转换 六、For循环 七、三元运算 八.列表 九、列表推导式 十、元组 十一、字典 十二、集合set 十三、文件操作 十四、变量指向和深浅拷贝 一.字符编码: 计算机由美国人发明,最早的字符编码为ASCII,只规定了英文字母数字和一些特殊字符与数...

Flume日志收集

一、Flume介绍 Flume是一个分布式、可靠、和高可用的海量日志聚合的系统,支持在系统中定制各类数据发送方,用于收集数据;同时,Flume提供对数据进行简单处理,并写到各种数据接受方(可定制)的能力。 设计目标: (1) 可靠性 当节点出现故障时,日志能够被传送到其他节点上而不会丢失。Flume提供了三种级别的可靠性保障,从强到弱依次分别为:end-t...

tomcat服务编码集设置

有三处需要记住修改 截图如下效果图: 第一处,对控制台右键,选择“默认值”找到,并设置为gbk: 第二处,在conf中找到server.xml文件并设置: 第三处:找到bin文件,找到tomcat80w.exe,双击打开切换到java选项:  全部设置成一种搞定,有了这个控制台直接输出,是不是很方便了? 需要注意的事,由于微信支付必须设置为utf-...

Deno会在短期内取代Node吗?

转载请注明出处:葡萄城官网,葡萄城为开发者提供专业的开发工具、解决方案和服务,赋能开发者。 原文出处:https://blog.bitsrc.io/what-is-deno-and-will-it-replace-nodejs-a13aa1734a74   Deno是什么? Deno v1.0.0已于5月13日正式发布。 其开发者为Ryan Dahl...