本文记录对字符编码的理解
ASCLL码
ASCLL: 上个世纪60年代,美国制定了一套字符编码,对英语字符与二进制位之间的关系,做了统一规定。这被称为ASCII码,一直沿用至今。 ASCII码一共规定了128个字符的编码,比如空格"SPACE"是32(二进制00100000),大写的字母A是65(二进制01000001)。这128个符号(包括32个不能打印出来的控制符号),只占用了一个字节的后面7位,最前面的1位统一规定为0
Unicode
Unicode: 将世界上所有的符号都纳入其中。每一个符号都给予一个独一无二的编码,那么乱码问题就会消失。Unicode只是一个符号集,它只规定了符号的二进制代码,却没有规定这个二进制代码应该如何存储,不同标准占的字节数不同(大于1字节)
UTF-8
UTF-8: UTF-8最大的一个特点,就是它是一种变长的编码方式。它可以使用1~4个字节表示一个符号,根据不同的符号而变化字节长度。 UTF-8的编码规则很简单,只有二条:
对于单字节的符号,字节的第一位设为0,后面7位为这个符号的unicode码。因此对于英语字母,UTF-8编码和ASCII码是相同的。
对于n字节的符号(n>1),第一个字节的前n位都设为1,第n+1位设为0,后面字节的前两位一律设为10。剩下的没有提及的二进制位,全部为这个符号的unicode码。
英文在unicode中占2-4个字节(不同标准占的字节数不同,总之大于1字节),但utf-8中占一个字节
Unicode | UTF-8 |
---|---|
0000 0000-0000 007F | 0xxxxxxx |
0000 0080-0000 07FF | 110xxxxx 10xxxxxx |
0000 0800-0000 FFFF | 1110xxxx 10xxxxxx 10xxxxxx |
0001 0000-0010 FFFF | 11110xxx 10xxxxxx 10xxxxxx 10xxxxxx |
UTF-16
UTF-16:就是任何字符对应的数字都用两个字节来保存.但是很显然如果都是英文字母这做有点浪费,但汉字在utf-16中占2个字节,但在utf-8中可能占3个字节。
JS中的字符编码
JS中字符以UTF-16的格式存储,每个字符为为2个字节,可存字符为2^8*2^8个字符,但超出这个范围即Unicode编码大于65536,则通过四个字节存储。 以古文"𣦵"为例,Unicode值为145845,大于65536,以4个字节存储。 现有的charAt、charCodeAt只能处理Unicode编码范围内的字符,ES6引入codePointAt方法
var s = “𣦵”; console.log(s.codePointAt(0));//145845 charCodeAt() 方法可返回指定位置的字符的 Unicode 编码。这个返回值是 0 - 65535 之间的整数
JS中的编码解码函数
函数 | 描述 |
---|---|
decodeURI() | 解码某个编码的 URI。 |
decodeURIComponent() | 解码一个编码的 URI 组件。 |
encodeURI() | 把字符串编码为 URI。 |
encodeURIComponent() | 把字符串编码为 URI 组件。 |
escape() | 对字符串进行编码。(以弃用) |
unescape() | 对由 escape() 编码的字符串进行解码。(以弃用) |
示例
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>编码/解码</title>
</head>
<body>
<script type="text/javascript">
var test = "http://www.test.com/My test/";
var test1 = encodeURI(test);
var test2 = decodeURI(test1);
var test3 = encodeURIComponent(test);
var test4 = decodeURIComponent(test3);
console.log(test1);/*
http://www.test.com/My%20test/
*/
console.log(test2);/*
http://www.test.com/My test/
*/
console.log(test3);/*
http%3A%2F%2Fwww.test.com%2FMy%20test%2F
*/
console.log(test4);/*
http://www.test.com/My test/
*/
</script>
</body>
</html>