字節流,字符流,編碼的解釋
https://www.zhihu.com/question/39262026
http://www.ruanyifeng.com/blog/2007/10/ascii_unicode_and_utf-8.html
1. Buffer 是用來處理流操作的
2. 字符串轉化utf8字節數組, 然后在將字節數組轉化十六進制字符串
/** 將字符串轉化為utf-8字節 */ function ToUTF8(str) { var result = new Array(); var k = 0; for (var i = 0; i < str.length; i++) { var j = encodeURI(str[i]); if (j.length == 1) { // 未轉換的字符 result[k++] = j.charCodeAt(0); } else { // 轉換成%XX形式的字符 var bytes = j.split("%"); for (var l = 1; l < bytes.length; l++) { result[k++] = parseInt("0x" + bytes[l]); } } } return result; } /** 將 byte 字節轉化成十六進制 */ function Bytes2Str(arrBytes) { var str = "" for (var i = 0; i < arrBytes.length; i++) { var tmp; var num = arrBytes[i]; if (num < 0) { //此處填坑,當byte因為符合位導致數值為負時候,需要對數據進行處理 tmp = (255 + num + 1).toString(16); } else { tmp = num.toString(16); } if (tmp.length == 1) { tmp = "0" + tmp; } if (i > 0) { str += " " + tmp; } else { str += tmp; } } return str; } /** 將十六進制字符串轉化為 byte 數組 */ function Str2Bytes(name) { var hexA = new Array(); name.forEach(item => { if (item === 'ff') { return hexA } else { hexA.push(parseInt(item, 16)) } }) return hexA } /** UTF8 轉化為字符串 */ function UTF8ToStr(arr) { let val = '' arr.forEach(item => { if (item < 127) { val += String.fromCharCode(item) } else { val += '%' + item.toString(16).toUpperCase() } }) console.log(val) try { return decodeURI(val) } catch (err) { return val } }