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

发布于 2022-08-29 21:11:42 字数 367 浏览 15 评论 0

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

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

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

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

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

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(3

满天都是小星星 2022-09-05 21:11:42

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

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

無處可尋 2022-09-05 21:11:42

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]

土豪 2022-09-05 21:11:42

给楼上更简洁地补充下

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

能真正匹配汉字的是

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

3v4l

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文