文章目录
  1. 1. 信息编码方式
  2. 2. ASCII
  3. 3. 非 ASCII
    1. 3.1. Unicode
    2. 3.2. UTF-8
    3. 3.3. 汉字编码
  4. 4. 对比
    1. 4.1. GBK 和 UTF-8
    2. 4.2. UTF-32 和 UTF-8
    3. 4.3. JavaScript 使用的是啥编码
  5. 5. 扩展阅读

信息编码方式

  1. ASCII 编码:American Standand Code for Information Interchange 美国标准信息交换码
  2. 非ASCII 编码
    世界的(Unicode)
    中国汉字编码(GB2312,GBK,GB18030)

ASCII

  1. ASCII 是美国制定的字符编码,对应关系:英语字符 之与 二进制位 (鼻祖,最简单的方式)
  2. 标准的 ASCII 是由7位二进制数组成,用来表示26个英文大小写字母 和 特殊符号
    从0000 0000 到 0111 1111,共128个字符 【1个字节,最高位为0】
    详细的 ASCII 码对照表,可参考 http://wenku.baidu.com/view/f1c0e2fec8d376eeaeaa31fd.html

非 ASCII

Unicode

  1. 解决的问题:将世界上所有文字统一编码
    与 ASCII 码的区分,eg.“汉”用十六进制表示6C49,用二进制表示(1101100 01001001)至少2个字节or更多。
  2. 带来的问题
    对英文来讲,存储浪费。已知的英文 ASCII 码表示只需一个字节,足矣。造成的后果是:
    (1)出现了 Unicode 的多种存储方式
    (2)无法推广,直到互联网的出现(强烈要求统一的编码方式)
  3. Unicode 只是一个符号集,只规定了符号的二进制码 【却没有规定,这个二进制代码如何存储】
    中文的 Unicode,可参考 http://www.chi2ko.com/tool/CJK.htm
  4. Unicode是理论,UTF 是存储、传输方式 (eg. UTF-8:Unicode TransformationFormat-8bits)
    3套编码方式(Unicode用基本保留字):UTF-8,UTF-16,UTF-32

Unicode:想用一个集合表示全世界所有的字符,全世界的
格式,两个字节:U+XXXX
共收入10万+个符号,其中中日韩占了2/3+

存储:分区定义
每区存 216 个字符,称为一个平面(plain)
共有 17=25 个平面,所以,整个 Unicode 字符集的大小现在是 221

1个基本平面(BMP):0~216-1 即 U+0000 ~ U+FFFF
16个辅助平面(SMP):U+010000 ~ U+10FFFF

UTF-8

  1. UTF-8 是 Unicode 的实现方式之一,互联网上使用最广泛
  2. 特点:变长的字节编码方式(有控制位)对于一个字符的 UTF-8 编码,如下:
    1字节 0xxxxxxx 【 Unicode 兼容 ASCII 】
    2字节 110xxxxx 10xxxxxx
    3字节 1110xxxx 10xxxxxx 10xxxxxx
    4字节 11110xxx 10xxxxxx 10xxxxxx 10xxxxxx
    5字节 111110xx 10xxxxxx 10xxxxxx 10xxxxxx 10xxxxxx
    6字节 1111110x 10xxxxxx 10xxxxxx 10xxxxxx 10xxxxxx 10xxxxxx
    UTF-8 最多可用到6个字节。因此,UTF-8 中可用来表示字符编码的实际位数,最多有31位。
    而x所表示的值,与 Unicode 编码是一一对应的,高低位也相同。
  3. Unicode 和 UTF-8 的相互转换。
    有关 UTF-8,可参考 http://www.cnblogs.com/chenwenbiao/archive/2011/08/11/2134503.html

汉字编码

  1. UTF-8 是兼容 ASCII 的:英文1个字节,中文3个字节。
  2. 中国汉字的编码,有GB2312、GBK、GB18030
    表示范围:GB2312 < GBK < GB18030,均用2字节表一个汉字(高字节为1,以区分ASCII码)
    GB2312 出来较早,有些汉字和繁体字不支持
    均兼容 ASCII

对比

GBK 和 UTF-8

  1. 区别:字节不同
    GBK 中英文统一两字节
    UTF-8 英文1个字节,中文3个字节
  2. 区分:可用 BOM(Byte Order Mark)标记
  3. 互换:必须通过 Unicode 编码
  4. 字符集合:GB2312 < GBK < UTF-8
  5. 各自的适用场合:
    英文字符多时,用 UTF-8 省空间
    中文多时,用 GBK 省空间
    GBK 是中国的,在国家标准 GB2312 基础上扩充的,通用性差
    UTF-8 世界的,国际编码,通用性好

温馨提示:
现在几乎不用 GBK 了,大家默认的都是直接上 UTF-8。原因你懂的。
之所以还去查这一坨东西,主要是因为我之前不很清楚这些编码们之间的区别。

UTF-32 和 UTF-8

Unicode 只规定了每个字符的码点,如何表示则就涉及到了编码方法。

UTF-32:一个码点用4个字节表示,完全对应 Unicode 编码(前面加两字节的0喽)
优点:查找效率高
缺点:浪费空间,比相同的 ASCII 编码文件大四倍(缺点致命,导致实际上没有人使用它,甚至 HTML5 标准明文规定,网页不得编码成 UTF-32。嗯~ 好惨哦!)

说到节省空间,于是 UTF-8 诞生了。
UTF-8 是一种变长的编码方法,字符长度从1个字节-4个字节不等。
越常用的字符,字节越短;最前面的128个字符,只用1个字节表示,和ASCII码完全相同。
于是,它一跃成为互联网上最常见的网页编码。

JavaScript 使用的是啥编码

JavaScript 使用的是 UCS-2!
UCS-2 的码点和 Unicode 的完全一致,只用2个字节表示已有的字符。(UCS-2 后来被整合进了 UTF-16)

所以:
JavaScript 采用 Unicode 字符集
只支持16位的 UTF-16 编码,不支持32位(此处有bug,详见 扩展阅读

不过呢,JS的下一个版本 ECMAScript 6(ES6),大幅增加了对 Unicode 的支持,基本上解决了这个问题(详见 扩展阅读))。

扩展阅读

《Unicode与JavaScript详解》:http://www.ruanyifeng.com/blog/2014/12/unicode.html
今天(2015-03-10)看到了这篇有发展历史+部分理论的文章,有因有果、有理有据、有简要结论、有扩展阅读。这种方式挺好的,比纯理论(比如我上面的那堆)的读起来好多了,心情舒畅还佩服不已,故在此补充下。相关的点也已更新插入到了以上内容里,即上面顶格显示的那部分内容。

文章目录
  1. 1. 信息编码方式
  2. 2. ASCII
  3. 3. 非 ASCII
    1. 3.1. Unicode
    2. 3.2. UTF-8
    3. 3.3. 汉字编码
  4. 4. 对比
    1. 4.1. GBK 和 UTF-8
    2. 4.2. UTF-32 和 UTF-8
    3. 4.3. JavaScript 使用的是啥编码
  5. 5. 扩展阅读