开发者社区> 问答> 正文

为什么在正则不加模式修正符的时候,PHP去匹配的中文字符会是乱码的?

screenshot
情况如下:

php 5.5.11
mac osx 10.9.2、win7、centOS 6.3

代码如下:

echo preg_replace('/[\s-]+/', '-', '阿树')."\n";

测试结果如下:

Mac 乱码
windows、linux都正常

增加模式修正符后正常,如下:

echo preg_replace('/[\s-]+/u', '-', '阿树')."\n";

查找资料,是这么说的:

u(PCRE_UTF8)

此修正符启用了一个 PCRE 中与 Perl 不兼容的额外功能。模式字符串被当成 UTF-8。本修正符在 Unix 下自 PHP 4.1.0 起可用,在 win32 下自 PHP 4.2.3 起可用。自 PHP 4.3.5 起开始检查模式的 UTF-8 合法性。

请问:

1.u的意思就是将匹配的字符当作utf8吗,还有其他作用吗
2.我的代码是utf8,但是为什么只有mac(Unix)会乱码呢?

展开
收起
落地花开啦 2016-06-17 17:20:31 2388 0
1 条回答
写回答
取消 提交回答
  • 喜欢技术,喜欢努力的人

    树的utf8表示是e6 a0 91。敏感的话看到这里就应该明白了。

    第二个字节a0和n是一样的,从而被替换成了-,剩下左右两边的两个字节变成非法ASCII,显示成问号了,至于平台差异性,估计是所谓PCRE的问题吧,有兴趣可以钻进去查查

    2019-07-17 19:43:12
    赞同 展开评论 打赏
问答排行榜
最热
最新

相关电子书

更多
PHP 2017.北京 全球开发者大会——高可用的PHP 立即下载
PHP安全开发:从白帽角度做安全 立即下载
复杂PHP系统性能瓶颈排查及优化 立即下载