编码 Unicode 及其在 JavaScript 中的使用

一、Javascript 使用 unicode16 字符集,可以使用中文变量名和函数名

计算机使用 8 位(bit)二进制表示一个字节(Byte),计算机内存最小寻址单位就是 1 字节。早期为了在计算机上使用同一的方式使用字符,使用无符号整数来标记字符。

ANSI(美国国家标准局)制订了ASCII(American Standard Code for Information Interchange,美国信息交换标准代码),使用一个字节大小的二进制数来编码每个字符。ASCII已经被国际标准化组织(ISO)定为国际标准,称为ISO 646标准。

一个字节为8位二进制,2的8次方为256,因此有256个字符可以用一个字节来表示(0~255),但ASCII字符集只设计了128个字符(字母、数字、一些标点符号和控制字符),因此实际上只用到7位二进制,第八位设置为0,剩下的128个编码位置是闲置的。

有的计算机厂商可能会利用闲置的128个空位来制订一些字符的编码,称为OEM字符集。例如,IBM使用多出来的128位扩展了一个ASCII 扩展表,包含了一些控制符和制表符等等,被广泛使用在电子元件的数据通讯和存储中,但OEM字符集不是通用的标准。

为了编码更多的字符,2个研究字符编码的机构合并研究成果,制订了 unicode 字符集。unicode 字符集使用使用多个字节来为字符编码,按使用的字节数不同制订了不同方案,所有 unicode 编码方案前 1 个字节(256个码位)的编码对应的字符都是 ASCII 字符集中的字符。

目前 unicode 编码已经达到 64 位,使用 8 个字节标记一个字符。

如果每个字符用2个字节(16位二进制数)来标记,可以编码 65536 个字符(2 的16次方),这基本上已经可以标记世界上所有国家的语言符号,因此,在实际中通用的是UCS-2通用字符集(Universal Character Set,UCS),由ISO制定的ISO 10646(或称ISO/IEC 10646)标准所定义。UCS 为第一字节的128个空位增补了一个字符集,称为 C1控制符及拉丁文补充-1 (C1 Control and Latin 1 Supplement)。

UCS-2字符集编码法有17个位面,每个位面都用2个字节来标记字符,17个位面可以映射 1,112,064个字符,其中最常用最重要的是编号为 0 的位面,里面包含了最常用的字符编码,称为基本多国语言平面BMP(Basic Multilingual Plane)。

Unicode 第 0 平面(BMP)中的编码被划分为不同区段,各国文字符号、控制符、制表符、图形字符等 都有连续的分布,其中中文简繁体区段是 4E00-9FBF。

0000-007F:C0控制符及基本拉丁文 (C0 Control and Basic Latin)  

0080-00FF:C1控制符及拉丁文补充-1 (C1 Control and Latin 1 Supplement)  

0100-017F:拉丁文扩展-A (Latin Extended-A)  

0180-024F:拉丁文扩展-B (Latin Extended-B)  

0250-02AF:国际音标扩展 (IPA Extensions)  

02B0-02FF:空白修饰字母 (Spacing Modifiers)  

0300-036F:结合用读音符号 (Combining Diacritics Marks)

4E00-9FBF:CJK 统一表意符号 (CJK Unified Ideographs)

(......还有很多国家语言和甲骨文等已经不用或极少使用的语言或字符的专用区段)

从第1位面开始,字符的unicode编码已经超出16位二进制数的范围,因此UCS-2无法使用2个字节直接编码BMP位面之外的字符。但是,在 UCS-2 编码中,区段 UD800 到 UDFFF 的码位是闲置的保留位,因此,可以使用这个区段中的码位通过一定的转换方式映射到其他位面的 unicode 编码。

在实际的字符传输和存储行为中,为了节省字节数,可能不会直接传输 unicode 编码,而是使用 Unicode转换格式(Unicode Transformation Format,简称为UTF),目前常见的 UTF格式有UTF-7, UTF-7.5, UTF-8, UTF-16, 以及 UTF-32,他们是由 ITTF(Internet Engineering Task Force,互联网工程任务组)组织进行标准化的,UTF-8 和 UTF-16 编码使用比较广泛。

UTF-16 编码:该编码法在 UCS-2 第0位面字符集的基础上利用 D800-DFFF 区段的码位通过一定转换方式将超出2字节的字符编码为一对16比特长的码元(即32bit,4Bytes),称作代理码对 (surrogate pair)。

编码 Unicode 及其在 JavaScript 中的使用

例如字符“

编码 Unicode 及其在 JavaScript 中的使用

”,他处于编号'2'的位面(总共17个位面,位面编号为16进制数0-10,第0位面可以舍去编号0直接用4位16进制数编码),码位是A6A5,即unicode编码为 2A6A5,它在UTF-16中的代理码对为 d869 dea5,但是通过 js 的charCodeAt()函数只能得出高位码对,但是这并不影响解码软件对字符编码进行定位,因为这些字符的代理码对都是成对地分布在  UD800-UDFFF 区段内的,并不存在交叉的现象,知道高位码对也可以简单地搜索到低位码对。

编码 Unicode 及其在 JavaScript 中的使用

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:http://www.heiqu.com/f33ac200134dd539ff8172ef8b300cf6.html