Nodejs編碼轉化問題

目前Node.js僅支持hex、utf八、ascii、binary、base6四、ucs2幾種編碼的轉換。對於GBK,GB2312等編碼,Nodejs自帶的toString()方法不支持,所以中文轉化的時候須要加載第三方庫,主要有兩個編碼轉換庫iconv-lite和encoding,我的推薦使用encoding。node

 

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。npm

 

encoding:是對 node-iconv 和 iconv-lite 的再次封裝,encoding 首先調用 node-iconv,若是 node-iconv 沒法解析,則調用 iconv-lite 做爲替代方案。ui

encoding 安裝使用編碼

1. 安裝spa

 

npm install encoding

 

2.使用code

encoding 模塊就一個方法 convert(),使用方法爲:encoding.convert(text, toCharset, fromCharset)。對象

  • text: 須要轉換的對象,能夠爲 Buffer 或者 String 對象。
  • toCharset: 轉換後的編碼。
  • fromCharset: 轉換前的編碼,缺省爲 uft8。

轉換後的結果爲 Buffer 對象。blog

 

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

 

 

下面用實例來講明encoding的使用方法:ci

1.UTF8轉GBKit

例如"蘇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編碼,再進行輸出的結果是正確的格式。

相關文章
相關標籤/搜索