7.13关于es的字符集和编码方式

#先来看看一个很神奇的现象

emoji的表情的长度竟然是2???

究其原因要从es的字符集和编码方式谈起

一、ES的发展历史

JS的语言采用Unicode字符集,但是只支持一种编码方式

扫盲:utf8和utf16是unicode的一种编码方式,不是字符集,是为方便Unicode字符集方便在网络传输的一种加密方式

但是JS采用的编码方式既不是UTF8也不是UTF16,更不是UTF32,而是UCS-2

UTF32规定了每个字符串的码点使用4个字节表示即32位,虽然转换方式简单,但是十分浪费空间,ASCII编码使用 1字节,相比而言要大四倍,因此HTML5标准铭文规定网页不许使用32编码

如 U+0000 = 0x00 00 00 00  4字节

U+597D = 0x00 00 59 7D 不足的前面用0填充

这要从ES的诞生时间线说起:

1.1988年Unicode团队成立(指字符集)

2.次年1989年UCS团队成立(指字符集)

3.1990,UCS-2编码发布(指编码方式)

4.1991年两者合并字符集为Unicode(合并字符集)

5.1995Js诞生

6.1996UTF-16发布,取代UCS-2(指编码方式)

也就是说JS语言诞生的时候还没有UTF16编码!!

二、UCS-2编码的特点

UCS的开发进度快于Unicode,1990年就公布了第一套编码方法UCS-2,使用2个字节表示已经有码点的字符。

TF-8是一种变长的编码方法,字符长度从1个字节到4个字节不等。越是常用的字符,字节越短,最前面的128个字符,只使用1个字节表示,与ASCII码完全相同。

UTF-16编码介于UTF-32与UTF-8之间,同时结合了定长和变长两种编码方法的特点。它的编码规则很简单:基本平面的字符占用2个字节,辅助平面的字符占用4个字节。也就是说,UTF-16的编码长度要么是2个字节(U+0000到U+FFFF),要么是4个字节(U+010000到U+10FFFF)。

上述概括:

在Unicode中,最前面的65536个字符(包括最常见的所有字符)称为基本平面(BMP),码点(16进制)从U+0000---U+FFFF,目前共有17个平面,剩下的称为辅助平面(SMP)(U+010000到U+10FFFF)

UTF-16:当在BMP范围内的字符编码为2个字节,SMP为4个字节

UCS-2:全部二个字节,一视同仁

那么问题来了?超过2个字节的怎么处理

既然不属于UCS-2,那就当两个字符来看喽~~

再回来看刚开始提出的问题

我们使用 charCodeAt查看🎾的UTF16编码

charCodeAt() 方法返回0到65535之间的整数,表示给定索引处的UTF-16代码单元 

Unicode默认16禁止,再利用toString()转为16进制

但在——例如 Unicode 编码单元 > 0x10000 的这种——不能被一个 UTF-16 编码单元单独表示的情况下,只能匹配 Unicode 代理对的第一个编码单元

所以上面默认是第一个编码单元,完善为

即🎾的UTF16编码为4个字节的0xD83C DFBE

所以JS超过2个字节,当作两个字符来看,会把它当作 U+D83C和U+DFBE两个来看

查询Unicode编码得两个都为�

验证

这也就是为什么length会失效

仅仅只是length函数吗?

以slice为例

基本上所有的字符串函数在对4字节码点的字符串表现出奇怪的现象

虽然很少遇到但还是以防万一



总结来源:http://www.ruanyifeng.com/blog/2014/12/unicode.html

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 204,590评论 6 478
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 86,808评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 151,151评论 0 337
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,779评论 1 277
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,773评论 5 367
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,656评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,022评论 3 398
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,678评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 41,038评论 1 299
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,659评论 2 321
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,756评论 1 330
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,411评论 4 321
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,005评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,973评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,203评论 1 260
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 45,053评论 2 350
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,495评论 2 343