Nodejs基礎:巧用string_decoder將buffer轉成string

本文摘錄自《Nodejs學習筆記》,更多章節及更新,請訪問 github主頁地址。歡迎加羣交流,羣號 197339705javascript

模塊簡介

string_decoder模塊用於將Buffer轉成對應的字符串。使用者經過調用stringDecoder.write(buffer),能夠得到buffer對應的字符串。java

它的特殊之處在於,當傳入的buffer不完整(好比三個字節的字符,只傳入了兩個),內部會維護一個internal buffer將不完整的字節cache住,等到使用者再次調用stringDecoder.write(buffer)傳入剩餘的字節,來拼成完整的字符。node

這樣能夠有效避免buffer不完整帶來的錯誤,對於不少場景,好比網絡請求中的包體解析等,很是有用。git

入門例子

這節分別演示了decode.write(buffer)decode.end([buffer])兩個主要API的用法。github

例子一:golang

decoder.write(buffer)調用傳入了Buffer對象<Buffer e4 bd a0>,相應的返回了對應的字符串;網絡

const StringDecoder = require('string_decoder').StringDecoder;
const decoder = new StringDecoder('utf8');

// Buffer.from('你') => <Buffer e4 bd a0>
const str = decoder.write(Buffer.from([0xe4, 0xbd, 0xa0]));
console.log(str);  // 你

例子二:app

decoder.end([buffer])被調用時,內部剩餘的buffer會被一次性返回。若是此時帶上buffer參數,那麼至關於同時調用decoder.write(buffer)decoder.end()ide

const StringDecoder = require('string_decoder').StringDecoder;
const decoder = new StringDecoder('utf8');

// Buffer.from('你好') => <Buffer e4 bd a0 e5 a5 bd>
let str = decoder.write(Buffer.from([0xe4, 0xbd, 0xa0, 0xe5, 0xa5]));
console.log(str);  // 你

str = decoder.end(Buffer.from([0xbd]));
console.log(str);  // 好

例子:分屢次寫入多個字節

下面的例子,演示了分屢次寫入多個字節時,string_decoder模塊是怎麼處理的。學習

首先,傳入了<Buffer e4 bd a0 e5 a5>還差1個字節,此時,decoder.write(xx)返回

而後,再次調用decoder.write(Buffer.from([0xbd])),將剩餘的1個字節傳入,成功返回

const StringDecoder = require('string_decoder').StringDecoder;
const decoder = new StringDecoder('utf8');

// Buffer.from('你好') => <Buffer e4 bd a0 e5 a5 bd>
let str = decoder.write(Buffer.from([0xe4, 0xbd, 0xa0, 0xe5, 0xa5]));
console.log(str);  // 你

str = decoder.write(Buffer.from([0xbd]));
console.log(str);  // 好

例子:decoder.end()時,字節數不完整的處理

decoder.end(buffer)時,僅傳入了的第1個字節,此時調用decoder.end(),返回了,對應的buffer爲<Buffer ef bf bd>

const StringDecoder = require('string_decoder').StringDecoder;

// Buffer.from('好') => <Buffer e5 a5 bd>
let decoder = new StringDecoder('utf8');
let str = decoder.end( Buffer.from([0xe5]) );
console.log(str);  // �
console.log(Buffer.from(str));  // <Buffer ef bf bd>

官方文檔對於這種狀況的解釋是這樣的(跟廢話差很少),大約是約定俗成了,當utf8碼點無效時,替換成ef bf bd

Returns any remaining input stored in the internal buffer as a string. Bytes representing incomplete UTF-8 and UTF-16 characters will be replaced with substitution characters appropriate for the character encoding.

相關連接

你應該記住的一個UTF-8字符「EF BF BD」
http://liudanking.com/golang/...

相關文章
相關標籤/搜索