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编码的实现方法

以上。

最新文章

  1. APP产品交互设计分析总结(不断更新中...)
  2. 在树霉派上配置LAMP
  3. [PHP] Phalcon应用升级PHP7记录
  4. Jenkins配置的邮件无法发送的问题
  5. PNG图片压缩工具
  6. 网络包处理工具NetBee
  7. Global::time2StrHHMM_DNT
  8. bzoj1064
  9. 修改Atom 隐藏.gitignore忽略的文件/文件夹的配置
  10. iOS xcodebuild 打包app
  11. 【转】NuGet的安装与使用
  12. Flask -- 入门
  13. BBS的登陆——发帖——回帖
  14. 海量数据挖掘MMDS week6: MapReduce算法(进阶)
  15. es6入门总结
  16. phpmyadmin创建mysql的存储过程
  17. ReSharper 8 &amp; 9
  18. 『TensorFlow』网络操作API_上
  19. eclipse + maven搭建SSM框架
  20. Jmeter录制badboy

热门文章

  1. P3924 康娜的线段树(期望)
  2. P2763 试题库问题(dinic)
  3. spring使用@Value标签读取.properties文件的中文乱码问题的解决
  4. sql xml 入门 (二)
  5. Linear Regression with PyTorch
  6. 两步完成ssh免密码登录
  7. oracle RAC如何正确地删除ASM磁盘组
  8. bzoj 4591 超能粒子炮&#183;改 - Lucas
  9. Junit中的setUp()与setUpBefore(), tearDown()与tearDownAfterClass()解析
  10. for和while循环的区别