JS中UTF-8和UTF-16互轉


1.由於服務端使用的Go,默認是使用UTF-8編碼的,而JS默認是Unicode編碼的(也就是UTF-16),所以為了字符串編碼的一致性,將前端字符串數據編碼轉換為UTF-8之后再發送給服務端,服務端發送過來的字符串數據轉換回UTF-16再使用。

PS:關於編碼可參考《關於編碼:Unicode/UTF-8/UTF-16/UTF-32

 

2.UTF-16轉UTF-8

            var utf16ToUtf8 = function (utf16Str) { var utf8Arr = []; var byteSize = 0; for (var i = 0; i < utf16Str.length; i++) { //獲取字符Unicode碼值
                    var code = utf16Str.charCodeAt(i); //如果碼值是1個字節的范圍,則直接寫入
                    if (code >= 0x00 && code <= 0x7f) { byteSize += 1; utf8Arr.push(code); //如果碼值是2個字節以上的范圍,則按規則進行填充補碼轉換
                    } else if (code >= 0x80 && code <= 0x7ff) { byteSize += 2; utf8Arr.push((192 | (31 & (code >> 6)))); utf8Arr.push((128 | (63 & code))) } else if ((code >= 0x800 && code <= 0xd7ff) || (code >= 0xe000 && code <= 0xffff)) { byteSize += 3; utf8Arr.push((224 | (15 & (code >> 12)))); utf8Arr.push((128 | (63 & (code >> 6)))); utf8Arr.push((128 | (63 & code))) } else if(code >= 0x10000 && code <= 0x10ffff ){ byteSize += 4; utf8Arr.push((240 | (7 & (code >> 18)))); utf8Arr.push((128 | (63 & (code >> 12)))); utf8Arr.push((128 | (63 & (code >> 6)))); utf8Arr.push((128 | (63 & code))) } } return utf8Arr }

 

 

3.UTF-8轉UTF-16

            var utf8ToUtf16 = function (utf8Arr) { var utf16Str = ''; for (var i = 0; i < utf8Arr.length; i++) { //每個字節都轉換為2進制字符串進行判斷
                    var one = utf8Arr[i].toString(2); //正則表達式判斷該字節是否符合>=2個1和1個0的情況
                    var v = one.match(/^1+?(?=0)/); //多個字節編碼
                    if (v && one.length == 8) { //獲取該編碼是多少個字節長度
                        var bytesLength = v[0].length; //首個字節中的數據,因為首字節有效數據長度為8位減去1個0位,再減去bytesLength位的剩余位數
                        var store = utf8Arr[i].toString(2).slice(7 - bytesLength); for (var st = 1; st < bytesLength; st++) { //后面剩余字節中的數據,因為后面字節都是10xxxxxxx,所以slice中的2指的是去除10
                            store += utf8Arr[st + i].toString(2).slice(2) } //轉換為Unicode碼值
                        utf16Str += String.fromCharCode(parseInt(store, 2)); //調整剩余字節數
                        i += bytesLength - 1 } else { //單個字節編碼,和Unicode碼值一致,直接將該字節轉換為UTF-16
                        utf16Str += String.fromCharCode(utf8Arr[i]) } } return utf16Str }

 

參考網址:《通過javascript進行UTF-8編碼的實現方法

以上。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM