当前位置: 首页 > Web前端 > HTML

ES9(五)——UnicodePropertyEscapes

时间:2023-04-02 18:18:13 HTML

目录UnicodePropertyUnicodeScriptUnicodeBlockES6-ES10学习排版要理解这个新知识点,需要对文本编码非常熟悉,否则你会体会不到这个的意思功能。对于文本编码,需要了解两个概念:字符编码和文件编码。字符编码有ASCII,Unicode文件编码有UTF-8、GBK等。字符编码和文件编码的关系可以用一句话概括:文件编码和字符编码没有关系,也就是说,即使如果指定了文件编码,字符变量可以灵活选择,没有任何限制。根据Unicode规范,每个Unicode字符除了具有唯一的码位外,还具有其他属性:UnicodeProperty、UnicodeScript、UnicodeBlock,这些属性一般用在正则表达式中。UnicodeProperty按功能对字符进行分类,一个字符只能属于一个UnicodeProperty。也就是说,Property不关心字符所属的语言,只关心字符的功能。Unicode属性可以理解为一个字符组,把小写的p改成大写的就是字符组的专属字符组。考虑\\d匹配0-9字符组,\\D匹配0-9以外的字符组。letinput='abcdAeCd中国'console.log(input.match(/\p{L}/ug))//["a","b","c","d","A","e","C","d","中","国"]这段代码的意思是匹配输入的所有字符(不限语言),这里是UnicodeProperty:{L},这个属性的意思是任何语言的任何字母。有点等同于letinput='abcdAeCdChina'console.log(input.match(/./sg)){Ll}[任何小写字母加上大写字母]{N}[任何语言下的数字]更多Unicode属性请参考totheofficialwebsiteUnicodeScript根据字符所属的书写系统来划分字符,一般对应于某种语言。例如,\\p{Script=Greek}表示希腊语,\\p{Script=Han}表示中文。在下面的字符串中匹配中文letinput=`I'mchinese!我是中国人`console.log(input.match(/\p{Script=Han}+/u))//["我是中国人",index:12,input:"我是中国人!我是中国人",groups:undefined]如果这个新特性不适用,你可能只能在ES9之前这样做:letinput=`I'mchinese!我是中国人`console.log(input.match(/[\u4e00-\u9fa5]+/))//["我是中国人",index:12,input:"我是中国人!我是中国人",groups:undefined]虽然不同的写法看起来结果是一样的,但是时间过得真快,Unicode在2017年6月发布了10.0.0版本,在这20年的时间里,Unicode增加了很多汉字。例如Unicode8.0增加的第109号化学元素“?(?麦麦)”,其码位为9FCF,不在本正则表达式范围内。而如果我们期望程序中的/[\\u4e00-\\u9fa5]/与时俱进,匹配最新的Unicode标准,显然是不现实的。现在你只需要在UnicodeScripts中找到对应的名称,而不需要自己计算所有对应语言字符的Unicode范围。UnicodeBlock按照编码范围划分Unicode字符,所以每个字符只属于一个UnicodeBlock,例如:\\p{InBasic_Latin}:U+0000–U+007F\\p{InLatin-1_Supplement}:U+0080–U+00FF\\p{InLatin_Extended-A}:U+0100–U+017F\\p{InLatin_Extended-B}:U+0180–U+024F目前JavaScriptRegExp不支持UnicodeBlockES6-ES10学习布局