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

以上。

JS中UTF-8和UTF-16互转的更多相关文章

  1. js中Json字符串如何转成Json对象(4种转换方式)

    js中Json字符串如何转成Json对象(4种转换方式) 一.总结 一句话总结:原生方法(就是浏览器默认支持的方法) 浏览器支持的转换方式(Firefox,chrome,opera,safari,ie ...

  2. jsp中pageEncoding、charset=UTF -8

    jsp中pageEncoding.charset=UTF -8" 在JSP/Servlet  中主要有以下几个地方可以设置编码,pageEncoding="UTF-8". ...

  3. java 乱码详解_jsp中pageEncoding、charset=UTF -8"、request.setCharacterEncoding("UTF-8")

    http://blog.csdn.net/qinysong/article/details/1179480 java 乱码详解__jsp中pageEncoding.charset=UTF -8&quo ...

  4. 如何在 JS 中嵌入大量 HTML 代码 --更新2017-10-10 16:37:09

    一.一般方式 方式1:\ 要写在标签后面,看例子 var longString = "\ ------------------------\ ------------------------ ...

  5. json--pyton中obj与json的互转,js中obj与json的互转

    json 解释:json是一种跨平台的通用的数据格式 python中对象(obj)与json之间的相互转换 1.对象(obj)转json格式的字符串 json.dumps(res) res = () ...

  6. JS中,JSON 和 对象互转,数组和字符串的转换?

    JSON 与 J对象转化 要实现从对象转换为 JSON 字符串,使用 JSON.stringify() 方法: 如下: var json = JSON.stringify({a: 'Hello', b ...

  7. JS中URL编码参数(UrlEncode)

    JS中URL编码参数(UrlEncode) 网上有很多文字作品写涉及在JS中呈现类似UrlEncode功能时都是自定义参数来呈现,其实JS中本身就有那样的参数.参数parameter由于用类似URL的 ...

  8. 在Node.js中操作文件系统(一)

    在Node.js中操作文件系统 在Node.js中,使用fs模块来实现所有有关文件及目录的创建,写入及删除操作.在fs模块中,所有对文件及目录的操作都可以使用同步与异步这两种方法.比如在执行读文件操作 ...

  9. 在node.js中,使用基于ORM架构的Sequelize,操作mysql数据库之增删改查

    Sequelize是一个基于promise的关系型数据库ORM框架,这个库完全采用JavaScript开发并且能够用在Node.JS环境中,易于使用,支持多SQL方言(dialect),.它当前支持M ...

  10. js中的位运算

    按位运算符是把操作数看作一系列单独的位,而不是一个数字值.所以在这之前,不得不提到什么是"位": 数值或字符在内存内都是被存储为0和 1的序列,每个0和1被称之为1个位,比如说10 ...

随机推荐

  1. php操作共享内存shmop类及简单使用测试(代码)

    SimpleSHM 是一个较小的抽象层,用于使用 PHP 操作共享内存,支持以一种面向对象的方式轻松操作内存段.在编写使用共享内存进行存储的小型应用程序时,这个库可帮助创建非常简洁的代码.可以使用 3 ...

  2. 第三周作业HAproxy文件操作

    #coding:utf-8 #Author:Mr Zhi """ HAproxy配置文件操作: 1. 根据用户输入输出对应的backend下的server信息 2. 可添 ...

  3. 在Linux系统上卸载playOnLinux

    1.remove just the playonlinux package itself. sudo apt-get remove playonlinux 2.remove the playonlin ...

  4. topcoder srm 510 div1

    problem1 link 令$f(x)$表示[0,x]中答案的个数.那么题目的答案为$f(b)-f(a-1)$ 对于$f(x)$来说,假设$x$有$d$位数字,即$[0,d-1]$,那么可以进行动态 ...

  5. shell中的变量a=100, 什么时候作整数使用, 什么时候作字符串使用呢?

    shell中的变量a=100, 什么时候作整数使用, 什么时候作字符串使用呢? 这确实是一个困扰很久的一个问题? how it can be an issue? 事实上, 在shell中, 你可以认为 ...

  6. [转] J2EE基础知识

    Servlet总结 阐述Servlet和CGI的区别? CGI的不足之处: Servlet的优点: Servlet接口中有哪些方法及Servlet生命周期探秘 get和post请求的区别 什么情况下调 ...

  7. Ubuntu 14.04 上安装 Gurobi

    参考: Installing Gurobi 7 on Linux Ubuntu 14.04 上安装 Gurobi 1.在gurobi上创建一个账户,并登陆: 2.从gurobi optimizer上下 ...

  8. HDU 5245 Joyful(期望)

    http://acm.hdu.edu.cn/showproblem.php?pid=5245 题意: 给出一个n*m的矩阵格子,现在有k次操作,每次操作随机选择两个格子作为矩形的对角,然后将这范围内的 ...

  9. PHP feof()函数

    feof()函数检查是否已经到达文件末尾(EOF) EOF == end  of  file 如果出错或者文件指针到了文件末尾(EOF)则返回true,否则返回false 语法: feof(file) ...

  10. JMeter中关于动态切换不同CSV文件解决方案

    最近写case,需要当前播放节目的数据作为输入数据,所以每个时刻所用的数据只能是当前时刻附件的数据,尝试用CSV Data Set Config动态加载不同的文件,没有成功,好像CSV Data Se ...