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编码的实现方法》
以上。
JS中UTF-8和UTF-16互转的更多相关文章
- js中Json字符串如何转成Json对象(4种转换方式)
js中Json字符串如何转成Json对象(4种转换方式) 一.总结 一句话总结:原生方法(就是浏览器默认支持的方法) 浏览器支持的转换方式(Firefox,chrome,opera,safari,ie ...
- jsp中pageEncoding、charset=UTF -8
jsp中pageEncoding.charset=UTF -8" 在JSP/Servlet 中主要有以下几个地方可以设置编码,pageEncoding="UTF-8". ...
- 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 ...
- 如何在 JS 中嵌入大量 HTML 代码 --更新2017-10-10 16:37:09
一.一般方式 方式1:\ 要写在标签后面,看例子 var longString = "\ ------------------------\ ------------------------ ...
- json--pyton中obj与json的互转,js中obj与json的互转
json 解释:json是一种跨平台的通用的数据格式 python中对象(obj)与json之间的相互转换 1.对象(obj)转json格式的字符串 json.dumps(res) res = () ...
- JS中,JSON 和 对象互转,数组和字符串的转换?
JSON 与 J对象转化 要实现从对象转换为 JSON 字符串,使用 JSON.stringify() 方法: 如下: var json = JSON.stringify({a: 'Hello', b ...
- JS中URL编码参数(UrlEncode)
JS中URL编码参数(UrlEncode) 网上有很多文字作品写涉及在JS中呈现类似UrlEncode功能时都是自定义参数来呈现,其实JS中本身就有那样的参数.参数parameter由于用类似URL的 ...
- 在Node.js中操作文件系统(一)
在Node.js中操作文件系统 在Node.js中,使用fs模块来实现所有有关文件及目录的创建,写入及删除操作.在fs模块中,所有对文件及目录的操作都可以使用同步与异步这两种方法.比如在执行读文件操作 ...
- 在node.js中,使用基于ORM架构的Sequelize,操作mysql数据库之增删改查
Sequelize是一个基于promise的关系型数据库ORM框架,这个库完全采用JavaScript开发并且能够用在Node.JS环境中,易于使用,支持多SQL方言(dialect),.它当前支持M ...
- js中的位运算
按位运算符是把操作数看作一系列单独的位,而不是一个数字值.所以在这之前,不得不提到什么是"位": 数值或字符在内存内都是被存储为0和 1的序列,每个0和1被称之为1个位,比如说10 ...
随机推荐
- php 获取顶级域名
/** * 获取顶级域名 * @param $url * @return string */ public static function getDoMain($url){ if(empty($url ...
- 2016 icpc ECfinal && codeforcesgym101194
一不小心惨变旅游队,不过上海的风景不错 顺带找其他队交流一下集训经验...或许可以成为选拔和集训16级的依据 A.直接模3就可以了,2^(3*n)%7=1 C.Mr. Panda and Strips ...
- neutron 的 quota design
发现, cinder, nova 制实现了, CountableResource. 只有nuetron实现了 TrackedResource 和 CountableResource. I read u ...
- 0x17二叉堆之超市
题目链接:https://www.acwing.com/problem/content/147/ 容易想到一个贪心策略:在最优解中,对于每个时间(天数) t,应该在保证不卖出过期商品的前提下,尽量卖出 ...
- C语言动态链表数据结构实现的学生信息项目
注:此项目来源于吕鑫老师的教程 #define _CRT_SECURE_NO_WARNINGS #include <iostream> #include <conio.h> u ...
- 2018年11月10日 input,print,pass 用法,条件语句+字符串
name=input('请输入用户名')#永远等待用户输入 password=input('请输入密码') print(name) print(password) 变量定义的规则: 变量名只能是 字母 ...
- topcoder srm 540 div1
problem1 link 设第一个数字为$x$,那么第2到第$n$个数字都可以表示成$a+bx$的形式,其中$b=1$或者$b=-1$.然后可以求出关于$x$的一些范围,求交集即可. problem ...
- ODAC(V9.5.15) 学习笔记(四)TCustomDADataSet(4)
6.Options TCustomDADataSet的选择项为TDADataSetOptions,其成员介绍如下表 : 名称 类型 说明 TDADataSetOptions AutoPrepare B ...
- Vue学习【第四篇】:Vue 之webpack打包工具的使用
什么是webpack webpack是一个模块打包工具.用vue项目来举例:浏览器它是只认识js,不认识vue的.而我们写的代码后缀大多是.vue的,在每个.vue文件中都可能html.js.css甚 ...
- tp框架中的一些疑点知识-4
$_SERVER的几个元素: script_name脚本名称, 是指这个脚本文件本身的文件名, 通常只是 : /index.php path_info: 是从控制器/操作方法开始到最后的内容,包括路径 ...