关于正则匹配中为什么 [\x7f-\xff]+ 能匹配到所有的汉字
看到别人的代码通过这个来匹配所有汉字
preg_match('/[\x7f-\xff]+/', $map)
[\x7f-\xff]+
是表示ascii表里面的127~255的多个字符是吗?但是那些字符都不是汉字啊,怎么放一起就变成汉字了呢?不明白,请教下大家。
ASCII码表 (0~255) http://www.douban.com/note/22078526/
又有朋友说是GBK码,我晕了,求大家给点详细说明介绍啥的。
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(3)
你确定匹配的规则是正确的?
应该是[\x80-\xff]+ 吧, 而且能这样匹配的应该是utf-8编码中的非ascii编码字符
简单说下,因为utf-8的字符,如果是非ascii编码的都是以1开头,具体来说就是10000000~1111111
具体参考链接:http://www.ruanyifeng.com/blog/2007/10/ascii_unicode_and_utf-8.html
GB2312(GBK)为了和 ASCII 兼容,使用了最高位为
1
的编码方式。你给出的链接是扩展的 ASCII 码表,标准的 ASCII 码表共 127 个字符,01 - 7F。
而 GBK 为了不和 ASCII 混淆,使用最高位的
1
来编码,占 2 个字节。这样,当进行编码解析的时候就简单的,如果遇到最高位如果是
0
那么就是 ASCII 码。如果最高位是
1
那就在继续读取下一个字节。0
,乱码。1
,则这两个字节对于一个汉字。因此,简单的匹配汉字的规则就是
[\x80-\xff]
。给楼上更简洁地补充下
[\x80-\xff] 对应的是extended ASCII codes (character code 128-255)
能真正匹配汉字的是
3v4l