1。什么是Unicode

Unicode源于一个非常简单的想法:世界上所有的字符都包含在一个集合中。如果计算机支持这个字符集,它将显示所有字符,并且不会再出现随机代码。







它从0开始,指定每个符号的个数,称为代码点。例如,代码点0的符号为空(表示所有的二进制位是0)。

复制代码如下:0000

在上一种形式下,u表示十六个十进制数后面跟着的是Unicode的代码点。







目前,Unicode的最新版本是7版,共有109449个符号,其中74500个是中国和韩国。它可以近似地认为超过2 / 3世界上现有的符号是从东亚语言。例如,中国的好的代码点是十六597d。

复制代码如下:U + 597d =好

这么多的符号,Unicode不是一次性定义,而是一个分区定义,每个区域都可以存储65536(216)个字符,称为平面(平面),目前,总共有17个(25)面,也就是说,整个Unicode字符集的大小现在是221。

第一65536字位,称为基础平面(简称BMP),从0到16范围和216-1,U + 0000 U + FFFF 16。所有最常见的字都放在这个平面,这是Unicode首先宣布第一架飞机。

其余的字符放在辅助平面(简称SMP),从U + 010000 u + 10ffff代码点范围。





二、UTF-32和UTF-8

Unicode只指定每个字符的代码点,用哪种字节顺序表示代码点,这涉及编码方法。

最直观的编码方法是每个代码点是由四个字节表示,和字节的内容对应的码点之一。这种编码方法被称为utf-32.for例子,代码点0是由四个字节0表示,和编码597d 0在前面两字节。

复制代码如下:u + 0000 = 0x0000 0000u + 597d = 0x0000 597d



对UTF-32的优点是转换规则简单直观,且搜索效率高。缺点是空间的浪费,英语课文的内容相同,它将比ASCII码的大四倍。这是一个致命的缺陷,导致没有人事实上使用这种编码方法,和HTML5标准规定的网页不能被编码为UTF-32。





人们真正需要的是一个节省空间的编码方法,导致utf-8.utf-8的诞生是一个长期的编码方法与特征长度从1字节到4字节。更常用的字,短的字节,前128个字符,只有1个字节,完全一样的ASCII码。

编号范围的字节值- 0x007f10x0080 - 0x07ff20x0800 - 0xffff30x010000 - 0x10ffff4

由于空间节能UTF-8,它已成为最常见的网页在互联网上的编码,但是,它有什么与今天的主题,我不想去深。具体的代码转换方法可以参考我多年前写的字符编码注释。

三、以UTF-16简介

UTF-16编码UTF-32和UTF-8之间,并结合两种编码方法的特点,固定长度和可变长度。

其编码规则很简单:基本面上的字符占用2个字节,并在辅助平面字符占用4字节,UTF-16编码长度为2个字节(U + 0000 u + FFFF)或4字节(U + 010000 u + 10ffff)。









所以有个问题。当我们遇到两个字节时,我们怎么看它是一个字符本身,还是需要用另外两个字节来读取它

它非常精巧,我不知道它是否有意设计。在基本面,从U + U + DFFF D800是一个空白段,即这些点不符合任何字符。因此,这个空的部分可以用图的辅助平面字符。

特别是,有220位在辅助平面字符,也就是说,至少有20个二进制位是这些characters.utf-16要求将20位分成两部分。第一个10比特映射从U + D800 U + dbff(空间的大小210),这是所谓的高位置(H),后者10比特映射从U + dc00 U + DFFF(空间的大小210),这是所谓的低比特(L)。这意味着一个辅助平面字符的字符表示拆成两个基本面。







所以当我们遇到了两个字节,发现其编码点u + D800和U + dbff之间,我们可以得出这样的结论:两个字节,密切跟踪代码点应U + dc00 U + DFFF之间,和四字节的解释必须在一起。

转换公式四和UTF-16

当Unicode代码点变为UTF-16,它首先区分基本面特征之间,或辅助平面字符。如果是前者,编码直接转换为带形成相应的十六,长度与两个字节。

复制代码如下:U + 597d = 0x597d

如果它是辅助平面字符,Unicode 3版本给出了代码转换公式。

复制代码如下:H = math.floor((c-0x10000) / 0x400)+ 0xd800l =(C 0x10000)% + 0xdc00 0x400





在性质上,它是一个辅助平面字符,代码点u + 1d306,和把它变成UTF-16的计算过程如下。

复制代码如下:H = math.floor((0x1d306-0x10000) / 0x400)+ 0xd800 = 0xd834l =(0x1d306-0x10000)% + 0xdc00 = 0xdf06 0x400

所以,一个字符的UTF-16编码是0xd834 df06,一个长度为四字节。







五,Javascript使用什么类型的代码





Javascript语言使用Unicode字符集,但只支持一种编码方法。

这个代码是不是UTF-16和UTF-8,也不是utf-32.the上述编码方法,Javascript不使用。

Javascript使用UCS-2!





六、UCS-2编码

你怎么突然杀UCS-2这需要一点历史。

在上网的时候没出现,有两支球队谁想做一个统一的字符集。是Unicode的团队,成立于1988,和其他成立于1989的UCS团队。当他们发现彼此的存在,很快就被认为没有两套统一字符集的世界。

1991年10月,两支球队决定合并字符集。也就是说,从现在起,只有一套字符集,即Unicode,修改先前公布的字符集,和UCS的编码点会完全一样的Unicode。







UCS的发展速度比Unicode。1990、编码方法、UCS-2,第一集出版了,用2个字节表示一个代码点的字符。(只有一个平面的当时,这是基本面,所以2个字节是不够的。)UTF-16编码1996年7月下旬发布公告,宣布是UCS-2的超集,即使用UCS-2字符编码的基本面,辅助平面定义表示4字节字符。

两者之间的简单关系,UTF-16取代UCS-2,或者UCS-2集成到utf-16.so,现在只有UTF-16,没有UCS-2。

七、javascript的诞生背景

所以,为什么不选择一个更先进的Javascript UTF-16使用UCS-2已经淘汰了吗

答案很简单:不想做的事,不是的。因为当Javascript语言的出现,没有UTF-16编码。

1995年5月,BrendanEich用了10天时间设计Javascript语言。十月,第一个解释引擎问世。明年十一月,网景正式提交语言标准ECMA(看到Javascript诞生)在整个过程中,相对于UTF-16的发布时间(1996年7月),这将是明确的,网景没有其他选择,当时,只有一个UCS-2编码方法是可用的!









八,Javascript字符函数的局限性

因为Javascript只能处理UCS-2编码,在这种语言中所有的人物都是2字节,如果是4字节的字符,它将被视为两个双字节字符。Javascript的角色功能的影响,这一点不能返回正确的结果。







在性格上,例如,其UTF-16编码是4个字节的0xd834df06。问题是,4字节的代码不属于UCS-2,Javascript不认识它,只把它作为一个单独的两个字符u + d834 U + df06.as前面所提到的,这两个代码点是空的,所以Javascript会认为这是一个系列的两个空字符!







上面的代码显示Javascript认为字符的长度是2,第一个字符是一个空字符,并且第一个字符的代码点0xdb34。这些结果是不正确的!





要解决这个问题,必须对代码点进行判断并手动调整。

复制代码如下:在(+指数= 0xd800,字符码<= 0xdbff){ output.push(文字+ string.charat(+指数));}否则{ output.push(字符);} }

上面的代码表明,当我们通过字符串时,我们必须对代码点做出判断。As long as we fall in the interval from 0xD800 to 0xDBFF, we must read together with the 2 bytes.



所有Javascript字符操作函数都存在类似的问题。

String.prototype.replace()

String.prototype.substring()

String.prototype.slice()

…



上述函数都只适用于2字节的代码点。要正确处理4字节的代码点,您必须逐一部署自己的版本,以确定当前字符的代码点范围。

九,ECMAscript 6





Javascript的下一个版本,ECMAscript 6(称为6),大大增强了Unicode支持,基本解决了问题。



(1)正确识别人物



6能自动识别4字节的编码点。所以,这是非常简单的遍历字符串。

将代码复制如下…

但是,为了保持兼容,长度属性仍然是相同的行为方式。

复制代码如下:Array.from(字符串长度)。

(2)码点表示法



Javascript允许Unicode字符可以直接与一个代码点表示,写成反斜杠+ U +代码点。

复制代码如下:好的= = = u597d ' /真的

然而,这表示4字节的代码points.es6改正问题是无效的,只要代码点放在括号内,可以正确识别。









(3)字符串处理函数



6又增加了几个功能专门处理4字节码点。

string.fromcodepoint():返回从Unicode代码点对应的字符

String.prototype.codePointAt():返回字符对应的代码点

String.prototype.at():返回字符串的指定位置的字符

(4)正则表达式



6提供了一个修改正则表达式添加4字节的代码点。





(5)Unicode标准化



除了字母外,有些字符还有附加符号。例如,汉语拼音,字母表上的声调是一个附加的符号。







Unicode provides two representations.One is a single character with additional symbols, i.e. a code point represents a character, such as the code is U+01D1; the other is a symbol will be added as a separate code, with the main character of composite display, namely two code point represents a character, for example, can be written as O (U+004F) + (U+030C).

复制代码如下: / / / / u01d1 ' ' / /法两 u004f u030c ' / /方法

这两种表示形式都是可视的和语义的。

复制代码代码如下: u01d1= = = u004f u030c ' / /假

6提供了一种规范方法允许Unicode

复制代码如下:( u01d1。规范)( u004f u030c。规范) / /真实= = =

更多关于6,看看ECMAscript 6 。