在javascript代碼中,有些地方咱們須要將string轉爲byte數組再進行進一步處理,網上太少這方面的資料。這裏我根據java中String.getByte(「UTF-8」)的實現機制來進行string轉byte數組的處理,同時解決中文和非英文字母轉byte數組時的編碼問題。其代碼以下:javascript
/** *@description:將string轉爲UTF-8格式signed char字節數組 * */ function stringToBytes(str) { var bytes = new Array(); for (var i = 0; i < str.length; i++) { var c = str.charCodeAt(i); var s = parseInt(c).toString(2); if (c >= parseInt('000080', 16) && c <= parseInt('0007FF', 16)) { var af = ''; for (var j = 0; j < (11 - s.length); j++) { af += '0'; } af += s; var n1 = parseInt('110' + af.substring(0, 5), 2); var n2 = parseInt('110' + af.substring(5), 2); if (n1 > 127) n1 -= 256; if (n2 > 127) n2 -= 256; bytes.push(n1); bytes.push(n2); } else if (c >= parseInt('000800', 16) && c <= parseInt('00FFFF', 16)) { var af = ''; for (var j = 0; j < (16 - s.length); j++) { af += '0'; } af += s; var n1 = parseInt('1110' + af.substring(0, 4), 2); var n2 = parseInt('10' + af.substring(4, 10), 2); var n3 = parseInt('10' + af.substring(10), 2); if (n1 > 127) n1 -= 256; if (n2 > 127) n2 -= 256; if (n3 > 127) n3 -= 256; bytes.push(n1); bytes.push(n2); bytes.push(n3); } else if (c >= parseInt('010000', 16) && c <= parseInt('10FFFF', 16)) { var af = ''; for (var j = 0; j < (21 - s.length); j++) { af += '0'; } af += s; var n1 = parseInt('11110' + af.substring(0, 3), 2); var n2 = parseInt('10' + af.substring(3, 9), 2); var n3 = parseInt('10' + af.substring(9, 15), 2); var n4 = parseInt('10' + af.substring(15), 2); if (n1 > 127) n1 -= 256; if (n2 > 127) n2 -= 256; if (n3 > 127) n3 -= 256; if (n4 > 127) n4 -= 256; bytes.push(n1); bytes.push(n2); bytes.push(n3); bytes.push(n4); } else { bytes.push(c & 0xff); } } return bytes; }
這樣,就完成了string經過UTF-8轉byte數組。
通過算法可精簡爲如下代碼:java
function str2UTF8(str) { var bytes = new Array(); var len, c; len = str.length; for (var i = 0; i < len; i++) { c = str.charCodeAt(i); if (c >= 0x010000 && c <= 0x10FFFF) { bytes.push(((c >> 18) & 0x07) | 0xF0); bytes.push(((c >> 12) & 0x3F) | 0x80); bytes.push(((c >> 6) & 0x3F) | 0x80); bytes.push((c & 0x3F) | 0x80); } else if (c >= 0x000800 && c <= 0x00FFFF) { bytes.push(((c >> 12) & 0x0F) | 0xE0); bytes.push(((c >> 6) & 0x3F) | 0x80); bytes.push((c & 0x3F) | 0x80); } else if (c >= 0x000080 && c <= 0x0007FF) { bytes.push(((c >> 6) & 0x1F) | 0xC0); bytes.push((c & 0x3F) | 0x80); } else { bytes.push(c & 0xFF); } } return bytes; }
具體爲何這麼轉,能夠參考個人另外一篇博客http://blog.csdn.net/a123638/...。算法
版權全部,嘿嘿!數組
————————————————
版權聲明:本文爲CSDN博主「第三眼的思緒」的原創文章,遵循 CC 4.0 BY-SA 版權協議,轉載請附上原文出處連接及本聲明。
原文連接:https://blog.csdn.net/a123638...編碼