您的位置:首页 > Web前端 > JavaScript

JS中编码操作

2019-10-26 16:09 1506 查看
原文链接:https://www.mk2048.com/blog/blog.php?id=h021hhkiii2j&title=JS%E4%B8%AD%E7%BC%96%E7%A0%81%E6%93%8D%E4%BD%9C

常见的网页设计编码:Unicode的UCS-2 UCS-4 UTF-8 UTF-16 UTF-32以及ASCII和ANSI。

要知道JS最初定稿时使用的编码是UCS-2(因为那时候还没UTF-16,本质:UTF-16就是对UCS-2的扩展,前面的65536个字符就是UCS-2本身,后面的一直到10FFFF编号的字符是UTF-16新增的字符集),后来的ES6标准中加入了对UTF-16的支持。

题外话:现在已经没有UCS编码了,UCS的组织是ISO(国际标准化组织),而Unicode是多个多语言软件公司组成的一个组织,他们最后都同意整合各自的编码规则使世界字符编码规则趋于统一。最后的统一世界编码的项目名便是Unicode,UCS-2是旧时对65536个字符的统一编码的解决方案,而UCS-4是对到10FFFF编号的字符解决方案,UTF-32就是UCS-4(始终用4字节来存储字符),变了个新名字而已。UTF-8和16有对应的各自编码转换规则,这里就不说了。GBK的话就是编码序号对应每个汉字(一对一查表,无法通过计算获取对应字符,是地方语言编码规则,仅限在中国大陆使用),无对应的转换规则可用。再说一下UTF-16代理对的含义,在UTF-16中为了要表示剩下的16个平面字符(UTF-16范围是到10FFFF为止的,共17个平面),在基本平面的D800~DFFF这些码点设为代理,一共可以代理1024的平方个,正好是剩下的16个平面的范围。另外,如果出现ANSI的编码,说明该编码从ASCII扩展过来,比如你在中文操作系统中,在ASCII编码的文件中输入了汉字(即超出ASCII范围的字符)那么ASCII自动扩展为ANSI,在这里即GBK,如果是繁体中文操作系统那么ANSI即BIG5。

以下有"-ES6"标记的函数是ES6标准新加进来的。

String.fromCodePoint(十进制的utf-16); -ES6 //返回基本数据类型,字符串

String.fromCharCode(十进制的UCS-2); //返回基本数据类型,字符串

stringObj.charAt(index); //返回基本数据类型,字符串

stringObj.charCodeAt(index); //返回十进制的该字符UCS-2值

stringObj.codePointAt(index); -ES6 //返回十进制的UTF-16值,然后该Index不是代理对直接返回这个字符UTF-16值

stringObj.at(index); -ES6 //对UTF-16字符的charAt()实现

\u{....} 用来表示UTF-16字符的Unicode引用

/..../u 用来向正则表达式说明该模式编码为UTF-16

附一个UTF-8转码范围表:

Unicode范围: 位数: UTF-8 字节: 备注:
0000~007F 0~7 0XXX XXXX 1 标准ASCII码
0080~07FF 8~11 110X XXXX 10XX XXXX {1} 2 除东亚的基本世界字符(东亚字符占世界所有字符的70%)
0800~FFFF 12~16 1110 XXXX 10XX XXXX {2}
3 基本平面:0~FFFF
1 0000~1F FFFF 17~21 1111 0XXX 10XX XXXX {3}
4 Unicode6.1定义的范围:0~10 FFFF(1 16个平面)
20 0000~3FF FFFF 22~26 1111 10XX 10XX XXXX {4}
5  
400 0000~7FFF FFFF 27~31 1111 110X 10XX XXXX {5} 6 通用字符集的极限

 

字符串"a我易":

UTF-8:(61)( E6 88 91)( E6 98 93)

UTF-8 BOM:(EF BB BF)( 61)( E6 88 91)( E6 98 93)

ANSI(GBK):(61)( CE D2)( D2 D7)

UCS-2:(FF FE)( 61 00)( 11 62)( 13 66)

UCS-2 BE:(FE FF)( 00 61)( 62 11)( 66 13)

UTF-16:(FF FE)( 61 00)( 11 62)( 13 66)

UTF-16 BE:(FE FF)( 00 61)( 62 11)( 66 13)

UTF-32:(FF FE 00 00)( 61 00 00 00 )(11 62 00 00 )(13 66 00 00)

UTF-32 BE:(00 00 FE FF)( 00 00 00 61 )(00 00 62 11)( 00 00 66 13)

字符串"a我\u{1D306}",其中\u{1D306}是一个非基本平面的字符,该字符为:𝌆(有些浏览器可能不支持显示该字符,正常显示的话,该字符类似汉字“三”多一横)

UTF-8:(61)( E6 88 91)( F0 9D 8C 86)

UTF-16:(FF FE )(61 00 )(11 62 )(34 D8 06 DF)

UTF-32:(FF FE 00 00)( 61 00 00 00)( 11 62 00 00)( 06 D3 01 00)

 


更多专业前端知识,请上【猿2048】www.mk2048.com
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: