美文网首页
ES9(五) —— Unicode Property Escap

ES9(五) —— Unicode Property Escap

作者: 顽皮的雪狐七七 | 来源:发表于2020-11-12 16:06 被阅读0次

    目录

    • Unicode Property
    • Unicode Script
    • Unicode Block
    • ES6-ES10学习版图

    了解这个新的知识点,需要对文本的编码非常熟悉,不然意识不到这个功能的意义。对于文本的编码需要了解两个概念:字符编码文件编码

    • 字符编码包括 ASCIIUnicode
    • 文件编码包括 UTF-8GBK等。

    字符编码和文件编码的关系可以用一句话来概括:文件编码和字符编码没有关系,也就是说即使指定了文件编码,字符变也可以灵活选择而不受任何限制。

    根据 Unicode 规范,每一个 Unicode 字符除了有唯一的码点,还具有其它属性:

    • Unicode Property
    • Unicode Script
    • Unicode Block

    这些一般用在正则里面。

    Unicode Property

    它按照字符的功能对字符进行分类,一个字符只能属于一个 Unicode Property。也就是说 Property 并不关心字符所属的语言,只关心字符的功能。

    可以将Unicode property 理解为字符组,将小写 p 改成大写,就是该字符组的排除型字符组。想想看 \d 匹配 0-9 这个字符组,而 \D 匹配 0-9 以外的字符组。

    let input = 'abcdAeCd中国'
    console.log(input.match(/\p{L}/ug))
    // ["a", "b", "c", "d", "A", "e", "C", "d", "中", "国"]
    

    这段代码的含义是在输入中匹配所有的字符(不限语言),这里使用的是 Unicode Property:{L},这个属性的含义是任何语言的任何字母。它有点等同于

    let input = 'abcdAeCd中国'
    console.log(input.match(/./sg))
    
    • {Ll} [任何具有大写字母的小写字母]

    • {N} [任何语言下的数字]

    更多的 Unicode Property 请查阅 官网

    Unicode Script

    按照字符所属的书写系统来划分字符,它一般对应某种语言。比如 \p{Script=Greek} 表示希腊语,\p{Script=Han} 表示汉语。

    匹配下列字符串中的中文

    let input = `I'm chinese!我是中国人`
    console.log(input.match(/\p{Script=Han}+/u))
    // ["我是中国人", index: 12, input: "I'm chinese!我是中国人", groups: undefined]
    

    如果不适用这个新功能点,在 ES9 之前大概只能这样做:

    let input = `I'm chinese!我是中国人`
    console.log(input.match(/[\u4e00-\u9fa5]+/))
    // ["我是中国人", index: 12, input: "I'm chinese!我是中国人", groups: undefined]
    

    虽然不同的写法看上去结果一样,然而时光飞逝,Unicode 在2017年6月发布了10.0.0版本。在这20年间,Unicode 添加了许多汉字。比如 Unicode 8.0 添加的 109 号化学元素「鿏(⿰⻐麦)」,其码点是 9FCF,不在这个正则表达式范围中。而如果我们期望程序里的/[\u4e00-\u9fa5]/可以与时俱进匹配最新的 Unicode 标准,显然是不现实的事情。现在只需要在 Unicode Scripts 找到对应的名称即可,而不需要自己去计算所有对应语言字符的的 Unicode 范围。

    Unicode Block

    Unicode 字符按照编码区间进行划分,所以每一个字符都只属于一个 Unicode Block,举例说明:

    • \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

    目前 JavaScript RegExp 还不支持 Unicode Block

    ES6-ES10学习版图

    ES6-10.png

    相关文章

      网友评论

          本文标题:ES9(五) —— Unicode Property Escap

          本文链接:https://www.haomeiwen.com/subject/huspbktx.html