前言
今天来学习UTF8转Unicode,UTF16转Unicode以达成UTF8,UTF16之间的互转。
提炼成函数的公式我并没有放出来,我的目的只是为了更加理解 字符编码之间的关系。
如果你需要转码方式,可以找其他的库,或者根据我文章来进行提炼。
基本利用按位操作符 符号运算符就可以完成。
今天这里只做UTF8转Unicode,UTF16转Unicode, 后续转换可以看前面的文章。
UTF16转Unicode
为了更好的理解,我们来使用Unicode转UTF-16那一期的结果
来进行UTF16转Unicode,U+22222转UTF-16 = [0xd848,0xde22] = '𢈢'(这个字的长度为二,所以要获取他所有的charCodeAt)
function charCodeAt(str){
var length = str.length,
num = 0,
utf16Arr = [];
for(num; num < length; num++){
utf16Arr[num] = '0x'+str[num].charCodeAt().toString(16);
}
return utf16Arr;
}
charCodeAt('𢈢');//['0xD848', '0xDE22']
计算utf-16 4字节的取值范围
上面代码获得了,这个字符的UTF-16编码数组,JS的字符串全部使用的UTF-16编码格式
回顾一下UTF-16的编码方式
将Unicode值减去0x10000,得到20位长的值,再将其分为高10位和低10位,分别为2个字节,高10位和低10位的范围都在 0 ~ 0x3FF,高10位加0xD800,低十位加0xDC00
首先我们先看字节问题,Unicode值在U+10000 ~ U+10FFFF时,会分为 两个2 字节,二进制 8位为一个字节,所以
UTF-16的四个字节的字符是两个 16位的二进制
并且根据UTF-16的编码方式的高位加0xD800 低位加0xDC00得出最小范围值
高10位最小值为0xD800,低10为最小值为0xDC00
再根据 高10位和低10位的范围都在 0 ~ 0x3FF得出最大范围值
高10位最大值为0xD800+0x3FF,低10为最大值为0xDC00+0x3FF
所以高10位的取值范围为 0xD800 ~ 0xdbff
低10位的取值范围为 高10位的取值范围为 0xDC00