关于正则匹配中为什么 [\x7f-\xff]+ 能匹配到所有的汉字

周梦康
  • 8.9k

看到别人的代码通过这个来匹配所有汉字

preg_match('/[\x7f-\xff]+/', $map)

[\x7f-\xff]+是表示ascii表里面的127~255的多个字符是吗?但是那些字符都不是汉字啊,怎么放一起就变成汉字了呢?不明白,请教下大家。

ASCII码表 (0~255) http://www.douban.com/note/22078526/

又有朋友说是GBK码,我晕了,求大家给点详细说明介绍啥的。

回复
阅读 8.7k
3 个回答
finallygo
  • 1.2k

你确定匹配的规则是正确的?
应该是[\x80-\xff]+ 吧, 而且能这样匹配的应该是utf-8编码中的非ascii编码字符
简单说下,因为utf-8的字符,如果是非ascii编码的都是以1开头,具体来说就是10000000~1111111

具体参考链接:http://www.ruanyifeng.com/blog/2007/10/ascii_unicode_and_utf-8.html

justjavac
  • 47.7k

GB2312(GBK)为了和 ASCII 兼容,使用了最高位为 1 的编码方式。

你给出的链接是扩展的 ASCII 码表,标准的 ASCII 码表共 127 个字符,01 - 7F。

0000 0001
0000 0010
...
...
...
0111 1111

而 GBK 为了不和 ASCII 混淆,使用最高位的 1 来编码,占 2 个字节。这样,当进行编码解析的时候就简单的,如果遇到

  1. 最高位如果是 0 那么就是 ASCII 码。

  2. 如果最高位是 1 那就在继续读取下一个字节。

    1. 如果下一个字节最高位是 0,乱码。
    2. 如果下一个字节最高位是 1,则这两个字节对于一个汉字。

因此,简单的匹配汉字的规则就是 [\x80-\xff]

给楼上更简洁地补充下

[\x80-\xff] 对应的是extended ASCII codes (character code 128-255)

能真正匹配汉字的是

preg_match_all('@\p{Han}@u','我艹',$m);

3v4l

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
宣传栏