![[北大青鸟佳音旗舰]JavaScript 有个 Unicode 的天坑.docx_第1页](http://file.renrendoc.com/FileRoot1/2020-1/14/f9be55ca-a82f-4ce6-89f0-b0c2ce928c78/f9be55ca-a82f-4ce6-89f0-b0c2ce928c781.gif)
![[北大青鸟佳音旗舰]JavaScript 有个 Unicode 的天坑.docx_第2页](http://file.renrendoc.com/FileRoot1/2020-1/14/f9be55ca-a82f-4ce6-89f0-b0c2ce928c78/f9be55ca-a82f-4ce6-89f0-b0c2ce928c782.gif)
![[北大青鸟佳音旗舰]JavaScript 有个 Unicode 的天坑.docx_第3页](http://file.renrendoc.com/FileRoot1/2020-1/14/f9be55ca-a82f-4ce6-89f0-b0c2ce928c78/f9be55ca-a82f-4ce6-89f0-b0c2ce928c783.gif)
![[北大青鸟佳音旗舰]JavaScript 有个 Unicode 的天坑.docx_第4页](http://file.renrendoc.com/FileRoot1/2020-1/14/f9be55ca-a82f-4ce6-89f0-b0c2ce928c78/f9be55ca-a82f-4ce6-89f0-b0c2ce928c784.gif)
![[北大青鸟佳音旗舰]JavaScript 有个 Unicode 的天坑.docx_第5页](http://file.renrendoc.com/FileRoot1/2020-1/14/f9be55ca-a82f-4ce6-89f0-b0c2ce928c78/f9be55ca-a82f-4ce6-89f0-b0c2ce928c785.gif)
已阅读5页,还剩4页未读, 继续免费阅读
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
北大青鸟佳音旗舰JavaScript 有个 Unicode 的天坑最近遇到了emoji表情的处理,期间发现JavaScript处理多字节字符时会有较多坑,与大家分享一下。Unicode (BMP/SP)UTF-8 UTF-16 UTF-32 UCS-2javascript字符处理UnicodeUnicode是目前绝大多数程序使用的字符编码,定义也很简单,用一个码点(code point)映射一个字符。码点值的范围是从U+0000到U+10FFFF,可以表示超过110万个符号。下面是一些符号与它们的码点A的码点 U+0041a的码点 U+0061的码点 U+00A9的码点 U+2603对于每个码点,Unicode还会配上一小段文字说明,可以在查到,比如 Unicode最前面的65536个字符位,称为基本平面(BMP-Basic Multilingual Plane),它的码点范围是从U+0000到U+FFFF。最常见的字符都放在这个平面,这是Unicode最先定义和公布的一个平面。剩下的字符都放在补充平面(Supplementary Plane),码点范围从U+010000一直到U+10FFFF,共16个。UTF与UCSUTF(Unicode transformation format)Unicode转换格式,是服务于Unicode的,用于将一个Unicode码点转换为特定的字节序列。常见的UTF有UTF-8 可变字节序列,用1到4个字节表示一个码点UTF-16 可变字节序列,用2或4个字节表示一个码点UTF-32 固定字节序列,用4个字节表示一个码点UTF-8对ASC编码是兼容的,都是一个字节,超过U+07FF的部分则用了复杂的转换方式来映射Unicode,具体不再详述。UTF-16对于BMP的码点,采用2个字节进行编码,而BMP之外的码点,用4个字节组成代理对(surrogate pair)来表示。其中前两个字节范围是U+D800到U+DBFF,后两个字节范围是U+DC00到U+DFFF,通过以下公式完成映射(H:高字节 L:低字节 c:码点)H = Math.floor(c-0x10000) / 0x400)+0xD800L = (c 0x10000) % 0x400 + 0xDC00比如:UCS(Universal Character Set)通用字符集,是一个ISO标准,目前与Unicode可以说是等价的。相对于UTF,UCS也有自己的转换方法(编码)。如:UCS-2 用2个字节表示BMP的码点UCS-4 用4个字节表示码点UCS-2是一个过时的编码方式,因为它只能编码基本平面(BMP)的码点,在BMP的编码上,与UTF-16是一致的,所以可以认为是UTF-16的一个子集。UCS-4则与UTF-32等价,都是用4个字节来编码Unicode。javascript字符处理那么,js到底是用的啥编码呢?答案是UCS-2。咦,刚刚不是说UCS-2过时了吗?首先看下年表1990 UCS-2 诞生1995.5 JavaScript 诞生1996.7 UTF-16 诞生也就是说,Brendan Eich在写JS的时候,UTF-16还没问世,所以只能用UCS-2的方式来处理字符,也因此留下了隐患。坑1length属性先看一个简单的例子:”uD83DuDCA9 =“true”2因为”怎么破?可以用万能的正则匹配varregexAstralSymbols=/uD800-uDBFFuDC00-uDFFF/g;/ 匹配UTF-16的代理对functioncountSymbols(string)returnstring/ 把代理对改为一个BMP的字符.replace(regexAstralSymbols,_)/ 这时候取长度就妥妥的啦.length;countSymbols();/ 1坑2反转字符串js里怎么反转(reverse)字符串?相信有些同学已经想到了一个极简的方案functionreverse(str)returnstr.split().reverse().join();js虽没有直接的反转字符串的API,但是数组有啊,转数组反转之后再转回字符串,嘿嘿嘿,是不是很机智?这时候Unicode大爷又出来打脸了:你们呐,sometimes naive!拿刚才的函数反转带有reverse(这是一坨)坨一是这的Unicode码点是+UFFFD,通常用来表示Unicode转换时无法识别的字符(也就是乱码)怎么破?ES6的Array.from支持代理对的解析functionreverse(string)returnArray.from(string).reverse().join();使用 Esrever (reverse反转之后就是esrever)坑3码点与字符互转String.fromCharCode可以将一个码点转换为字符,比如String.fromCharCode(0x0041)A但超过BMP平面的就跪了。String.fromCharCode(0x1F4A9)/ U+1F4A9/ U+F4A9, not U+1F4A9事实上这个API是支持俩参数的,分别是代理对的高低字节。所以需要通过公式计算出对应的高低字节String.fromCharCode(0xD83D,0xDCA9)/ U+1F4A9.charCodeAt(0)0xD83D怎么破? ES6大法好。String.fromCodePoint(0x1F4A9)/ U+1F4A9.codePointAt(0)0x1F4A9坑4正则匹配正则匹配符.只能匹配单个“字符”,但js将代理对当成两个单独的“字符”处理,所以匹配不到任何辅助平面字符。 /foo.bar/.test(foo)false思考一下,什么正则表达式可以表示任何Unicode字符? 显然.是不够的,因为它不能匹配辅助平面字符或者换行符。那么用sS呢? /sS$/.test()false怀疑人生了正确的匹配任意Unicode字符的正则如下: /0-uD7FFuE000-uFFFF|uD800-uDBFFuDC00-uDFFF|uD800-uDBFF(?!uDC00-uDFFF)|(?:uD800-uDBFF|)uDC00-uDFFF/.test()/ wtftrue怎么破? ES6给出一个简单的方法增加一个u标志 /foo.bar/u.test(foo)true注意:这里的.还是不能匹配换行符。ES6的Unicode支持从上面的例子中可以看出,ES6已经在很努力地填坑了。对于Unicode字符,
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2025年医疗器械管理师资格考试试卷及答案
- 2025年外科医生资格考试试题及答案
- Scyphostatin-生命科学试剂-MCE
- Agmatine-sulfate-Standard-生命科学试剂-MCE
- 2025年人民币汇率波动影响分析考试试卷及答案
- 2025年农作物育种学期末考试试题及答案
- 2025年社会心理学专业知识考试题及答案
- 2025年基础工程与施工管理考试试题及答案
- 2025年教师资格考试重点复习试卷及答案
- 2025年酒店管理专业实务考试题及答案
- 2025年广东省万阅大湾区百校联盟中考二模语文试题(含答案)
- 护士理论考试试题及答案
- 2024-2025学年天津市八年级下期末数学模拟试卷(附答案解析)
- 2025年继续教育公需科目网络考试试题及答案
- 福建省厦门市2023-2024学年高一下学期期末质量检测历史试题(解析版)
- 油漆工包工合同协议书
- 2025高考终极押题范文6篇与题目
- 工程项目经理竞聘演讲稿
- 基于“学-教-评”一体化理念下的高中古诗词教学策略研究
- 天津水务集团有限公司招聘考试真题2024
- 统编版(2024)七年级下册历史期末专题复习课件40张
评论
0/150
提交评论