← Back Home

字符编码详解

  1. JavaScript

本文记录对字符编码的理解

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>

comments powered by Disqus