美文网首页
Unicode中汉字表示

Unicode中汉字表示

作者: 蜗牛_Cy | 来源:发表于2018-10-11 16:31 被阅读0次

    最近在看阮一峰老师写的《ES6标准入门》
    其中第五章的代码让我产生了疑惑
    代码如下:

    var s = '𠮷𠮷';
    s.length // 4
    

    string.length 字符串的属性在工作中经常用到,但是并没有出现上述问题呀。
    例如:

    '你好'.length   //2
    

    咦~这就让我很疑惑了,为什么我输出字符串长度是能够正确显示,而书中却显示的错误的。我又把老师的代码拿出来跑一遍,'𠮷𠮷'.length确实是4,没有问题。

    注意这里的 ‘ 𠮷 ’ 并非吉利的 ‘ 吉 ’。

    而且在我工作中经常使用此属性判断中文字符串的长度。这让我产生了探究原因的动力。

    猜想:可能是Unicode对中文的标识方式不同导致的
    随即,翻阅了Unicode中文编码,印证了我的猜想。

    下面附上Unicode中文表示范围,以供参考

    一般使用2W个基本汉字就够了
    字符集 汉字 unicode编码
    基本汉字 20902字 4E00-9FA5
    基本汉字补充 38字 9FA6-9FCB
    扩展A 6582字 3400-4DB5
    扩展B 42711字 20000-2A6D6
    扩展C 4149字 2A700-2B734
    扩展D 222字 2B740-2B81D
    康熙部首 214字 2F00-2FD5
    部首扩展 115字 2E80-2EF3
    兼容汉字 477字 F900-FAD9

    问题原因

    JavaScript采用\uxxxx的形式来标识一个字符,其中xxxx标识Unicode码点。
    但是在ES5以及之前,这种标识方法只限于码点在\u0000~\uFFFF之间的字符。超出这个范围的字符,必须用2个双字节的形式表示。

    "\uD842\uDfb7"  //𠮷
    "\u20BB7" // 7
    

    上面代码表示,如果直接在 \u 后面跟上大于 0xFFFF 的数值(比如 \u20BB7)。JavaScript会理解为 \u20BB7+7。由于 \u20BB7 不是一个可以打印的字符,所以显示为一个空格,后面跟一个7.

    这就是为什么'𠮷'.length; //4的原因了

    ES6对这一问题做了改进,只要将码点放入大括号中,就能正确的解读该字符。

    "\u{20BB7}"     //𠮷
    

    解决办法

    使用ES6语法规则

    function codePointLength(text){
      var result = text.match(/[\s\S]/gu);
      return result ? result.length : 0
    }
    

    感想:阮一峰的《ES6标准入门》确实是一本很好的书,他将ES6将近全部内容用通俗的语言和简单易懂的例子展现出来,通过这本书我查缺补漏,确实学到了很多。我觉得这本书被命名为标准入门,确实低估了它对ES6知识范围的包含度。可能是阮一峰老师比较谦虚的原因吧,谦虚也是大师的风范。

    相关文章

      网友评论

          本文标题:Unicode中汉字表示

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