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編碼的實現方法》
以上。
