标签: 中文

  • JavaScript 中使用正则 `u` 标记匹配多语言

    JavaScript 中使用正则 `u` 标记匹配多语言

    JavaScript 里使用 Unicode 编码字符串。Unicode 是一种可变长度的编码类型,大部分时候,它用两个字节表示一个字符,大部分常见字符都在这 65536 的范围内。一些少见字符,比如各种语言文字、emoji,则会用到 4 个字节。

    以前我们用正则校验字符串的时候,可以用 /[a-zA-Z0-9]/ 检查字符,这样对英文和数字没问题,但不能匹配中文。如果要匹配中文和中文标点,可以用:

    /[\u4E00-\u9FCC\u3002\uff1b\uff0c\uff1a\u201c\u201d\uff08\uff09\u3001\uff1f\u300a\u300b]+/g

    ES2018 之后,我们可以使用 Unicode 属性 \p{...} 来匹配某一个类型的字符串,配合 /u 标记,就可以方便地匹配多字节字符串了。

    在匹配多语言文字时,可以传入 Script 参数,达到非常高效且简便的写法。比如中文,就是 \p{sc=Han},上面那么长的穷举(其实还没举完)正则只需要这么几个简单的字符就能替换,简单多了,对吧?借用下别人的例子:

    let regexp = /\p{sc=Han}/gu; // returns Chinese hieroglyphs
    
    let str = `Hello Привет 你好 123_456`;
    
    alert( str.match(regexp) ); // 你,好

    我们还可以用这个属性来匹配俄文:\p{sc=Cyrillic}。不过有趣的是,欧洲诸国文字多少有些区别,除了我们最熟悉的英文 26 个字母,德文就有 üöä,法文也有 ù,但它们都是拉丁文, \p{sc=Latin},甚至土耳其文也是,只有俄文不一样。

    Babel 也包含了对应的插件:@babel/plugin-proposal-unicode-property-regex · Babel (babeljs.io),在古早浏览器里可以转换成非 Unicode 形态,所以基本上可以放心使用。

    还是要不断更新自己的知识才行呀。

    (更多…)
  • 漏装php55w-mbstring导致中文邮件乱码

    漏装php55w-mbstring导致中文邮件乱码

    朋友的WordPress发中文邮件总是乱码,喊我帮忙看看。很奇怪,后台、文章里的中文都能正常显示,看起来一切正常;我在我电脑上搭了一套,同样的代码,发邮件也没问题。

    后来打开phpmailer的debug模式,发现什么都对,就是中文内容都是问号。

    继续往上找到发邮件的函数,运气不错插件留了filter,遂修改模板,add_filter强制转换内容。

    转换前先检查,不是UTF-8再转:

        if (!mb_detect_encoding($content)) {
          $content = iconv('ASCII', 'UTF-8', $content);
        }
        return $content;
    

    结果代码传上去报错,说没有mb_detect_encoding,然后想起来yum安装php时确实默认不包含很多扩展,于是手动安装yum install php55w-mbstring。然后重启apache,发邮件测试,正常了。

    我又想是不是缺少多字节文本模块(Multibyte String)导致原先无法发送中文呢?去掉filter,仍然正常,确实如此。

    总结

    yum安装新版php需要增加源,而新版的源默认不包含很多常用的库,使用的时候最好都装上。WordPress的翻译机制面对多字节文本时,编码不对不会报错,也需要小心。