Nodejs编码转化问题

目前Node.js仅支持hex、utf8、ascii、binary、base64、ucs2几种编码的转换。对于GBK,GB2312等编码,Nodejs自带的toString()方法不支持,因此中文转化的时候需要加载第三方库,主要有两个编码转换库iconv-lite和encoding,个人推荐使用encoding。

 

iconv-lite:是 iconv 的纯 js 实现,支持的编码包括 node.js 原生编码:utf8, ucs2, ascii, binary, base64;同时支持广泛使用的单字节编码:Windows 125x family, ISO-8859 family, IBM/DOS codepages, Macintosh family, KOI8 family, latin1, us-ascii;多字节编码:gbk, gb2313, Big5, cp950。

 

encoding:是对 node-iconv 和 iconv-lite 的再次封装,encoding 首先调用 node-iconv,如果 node-iconv 无法解析,则调用 iconv-lite 作为替代方案。

encoding 安装使用

1. 安装

 

npm install encoding

 

2.使用

encoding 模块就一个方法 convert(),使用方法为:encoding.convert(text, toCharset, fromCharset)。

  • text: 需要转换的对象,可以为 Buffer 或者 String 对象。
  • toCharset: 转换后的编码。
  • fromCharset: 转换前的编码,缺省为 uft8。

转换后的结果为 Buffer 对象。

 

1 var encoding = require('encoding');
2 
3 var result = encoding.convert("ÕÄÖÜ", "Latin_1");
4 console.log(result); //<Buffer d5 c4 d6 dc>

 

 

下面用实例来说明encoding的使用方法:

1.UTF8转GBK

例如"苏A00001"的GBK的对应形式为"CBD5413030303031".

 1 var fs = require('fs');
 2 var encodingConvert     = require('encoding');
 3 var buf                 = require('buffer');
 4 var temp = "苏A00001";
 5 var result = new String();
 6 
 7 var resultBuffer = encodingConvert.convert(temp, "GBK","UTF8");
 8 console.log("The resultBuffer is:",resultBuffer);
 9 
10 for(var i = 0;i < resultBuffer.length;i++)
11 {
12    
13     result+=resultBuffer.slice(i,i+1)[0].toString(16);
14  
15 }
16 result = result.toUpperCase();
17 
18 console.log("The result is:",result);

即第8行的resultBuffer是一个buffer,其内容就是对应的"CBD5413030303031",只不过要通过第16行进行大写转化。

第13行的作用就是取Buffer的每一位,resultBuffer.slice(i)的结果为<Buffer cb>,<Buffer d5>,<Buffer 41>,<Buffer 30>,<Buffer 30>,<Buffer 30>,<Buffer 30>,<Buffer 31>.

resultBuffer.slice(i)[0]的结果为203,213,65,48,48,48,48,49,由于Buffer里的是二进制,此结果就是二进制对应的十进制结果,再把其转化成16进制就是最后的结果。

 

2.GBK转UTF8

 1 var fs = require('fs');
 2 var encodingConvert     = require('encoding');
 3 var buf                 = require('buffer');
 4 
 5 var temp = "CBD5413030303031";
 6 var bufferArray = [0xcb,0xd5,0x41,0x30,0x30,0x30,0x30,0x31];
 7 var buffer = new Buffer(bufferArray);
 8 console.log("The buffer is:",buffer);
 9 console.log(buffer.toString());
10 
11 var plateDecoded = encodingConvert.convert(buffer, "UTF8", "GBK");
12             
13 console.log("The result is:",plateDecoded.toString());

 

从结果可以得出,如果不使用第11行的代码,则输出的中文是乱码,那是因为"CBD5413030303031"是GBK格式的编码格式,经过第11行的转化,转化成UTF8编码,再进行输出的结果是正确的格式。

转载于:https://www.cnblogs.com/cocos2014/p/4282024.html

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值