小马曾经有讲过PHP函数mb_detect_encoding误判带来的坑,今天再来讲讲这个函数的惊天秘密。你准备好了吗?

前景回顾

我们回顾一下之前的误判场景。逻辑代码是这样的:$encode = mb_detect_encoding($name, array('ASCII','UTF-8','GB2312', 'GBK', 'BIG5'));$name = mb_convert_encoding($name, 'UTF-8', $encode);

这段代码检测字符串的编码,然后得到字符串编码,并统一转为utf-8。嗯,一切似乎很合理。但是小马当时得到了一个非必现的BUG反馈,有些字符编码格式有问题导致业务逻辑失败呢。后来经过排查是mb_detect_encoding的误判问题。通过更换参数数组顺序得到解决。调整之后的代码:$encode = mb_detect_encoding($name, array('ASCII','GB2312', 'GBK', 'BIG5','UTF-8'));嗯,似乎案子就这样破了。

这是当时的卷宗

新的惊天秘密

然而,这真的是想多了,一个猝不及防的问题又悄然出现了。什么?案子还是没破?难道是案中有案,另有玄机。没错,你猜对了。接下来我们来看看两个案发现场。

以下是想实现一个支持中文汉字字母数字的正则校验,因为正则表达式是utf8的,所以我们同样先判断字符编码处理,然后统一转为utf8,然后使用正则进行校验。看起来似乎也很完美。

此时带着甜美的味道,我们来看下面的代码。上面未转码的正则校验正确,一旦转码,正则校验就不是我们预期的结果了。显然场面已经失控。

再来看下面这个场景,显然连转换编码都没达到预期的utf8,更不要说过正则了。请注意,代码是一样的,只是传参的字符串不一样而已。

很显然这个不是我们想要的

不得不说的是,有些函数转码utf8正常,而且正则校验也正常。

哈哈,大家来找茬,通过上面的两个例子,细心的不细心的你都能很快发现,尽管我们使用了调整正确顺序后的函数,但是我们可以看到,下面输出的结果是不一样的。这就引发思考了。说明这个编码检测函数还是不靠谱。PHP的汉字编码处理真是个头疼的问题。不过这个坑一定要特别小心!

怎么解决呢?小马暂时想到的就是:

先判断编码检测完转换utf8是否成功,如果成功,做相对应编码的正则校验(比较繁琐);

不通过正则校验,直接交给业务校验或者查询匹配来处理(依赖DB需酌情考虑);

如果业务允许,就先测试这个字符串校验是否可以正常,然后再交由前端业务使用(依赖业务);

那么对于PHP该怎么处理对于汉字字母数字的校验呢?正确的打开方式是什么呢?您有什么高见呢?欢迎讨论指点。原创文章,未经允许请勿转载!

php字符不可选状态,PHP字符编码判断猝不及防之坑相关推荐

  1. python中英文字符怎么区分-python 利用utf-8编码判断中英文字符的简单示例

    这篇文章主要为大家详细介绍了python 利用utf-8编码判断中英文字符的简单示例,具有一定的参考价值,可以用来参考一下. 感兴趣python 利用utf-8编码判断中英文字符的简单示例的小伙伴,下 ...

  2. php字符不可选状态,php – mailto不可读的字符 – unicode

    我在我的网站上使用mailto URI方案通过电子邮件发送当前页面. 问题是我使用印地语作为mailto链接中的主题 例 Testing 单击链接时,Outlook(版本6)打开,它显示一些不可读的字 ...

  3. python(40):利用utf-8编码判断中文英文字符

    #!/usr/bin/env Python # -*- coding:GBK -*- """汉字处理的工具: 判断unicode是否是汉字,数字,英文,或者其他字符. 全 ...

  4. python英文字符表示_python利用utf-8编码判断中文英文字符(转)

    下面这个小工具包含了判断unicode是否是汉字.数字.英文或者其他字符,全角符号转半角符号,unicode字符串归一化等工作. #!/usr/bin/env python # -*- coding: ...

  5. 哈夫曼树哈夫曼编码(已知A,B,C,D,E,F,G的概率分别为:17,25,50,67,40,60,30.画出其哈夫曼树和每个字符对应的哈夫曼编码)

    [也可以哈夫曼树与最优不等长编码] 已知A,B,C,D,E,F,G的概率分别为:17,25,50,67,40,60,30.画出其哈夫曼树和每个字符对应的哈夫曼编码.

  6. 刨根问底:C++中宽字符类型(wchar_t)的编码一定是Unicode?长度一定是16位?

    转发的:https://www.ituring.com.cn/article/111027的文章 刨根问底:C++中宽字符类型(wchar_t)的编码一定是Unicode?长度一定是16位? cons ...

  7. 根据使用频率为 5 个字符设计的哈夫曼编码不可能是( )

    根据使用频率为 5 个字符设计的哈夫曼编码不可能是( D ) A. 000,001,010,011,1 B. 0000,0001,001,01,1 C. 000,001,01,10,11 D. 00, ...

  8. java是几位的unicode,下列说法错误的是()。A.Java的字符类型采用的是Unicode编码,每个Unicode码占16位比特B.Java的各种...

    下列说法错误的是().A.Java的字符类型采用的是Unicode编码,每个Unicode码占16位比特B.Java的各种 更多相关问题 [名词解释] 捐躯juān qū [名词解释] 藕断丝连ǒu ...

  9. 计算机底层存储字节还是字符,彻底搞懂乱码——字符,字节和编码

    级别:中级 摘要:本文介绍了字符与编码的发展过程,相关概念的正确理解.举例说明了一些实际应用中,编码的实现方法.然后,本文讲述了通常对字符与编码的几种误解,由于这些误解而导致乱码产生的原因,以及消除乱 ...

最新文章

  1. 杭电 hdu 1003
  2. 宅在家限制智力输出?这场论文复现赛让思维发光
  3. Mysql基本用法-01
  4. 手机快充芯片及其技术标准和设计原理详解
  5. java me教程_Java ME基础教程
  6. linux USB摄像头 V4L2工具调试摄像头
  7. 【数据结构】图的基础练习题目,及题解
  8. 省市县GDP、地级市三大产业产值数据、农业GDP相关数据
  9. flex:1什么意思
  10. android3d动画的实现,Android 3D旋转动画库
  11. ajax串数组包含双引号,解决AJAX请求中含有数组的办法
  12. 分享一个妄想山海脚本辅助,另附PHP随机数生成器代码
  13. lbw的spring超级资源
  14. 基片集成波导原理_基片集成波导
  15. JAVA中的getBytes()方法
  16. 淘宝小程序 表单组件checkbox的默认样式修改
  17. SpringBoot整合RabbitMQ消息队列
  18. 逻辑运算符 位运算符_在现代PHP中,按位运算符仍然有意义吗?
  19. 管家婆软件分销ERP D9学习资料
  20. 计算机网络安全-----身份认证

热门文章

  1. 用.BAT修改IP地址(一个网卡同时添加两个不同的IP段)
  2. 抖音直播带货怎么做?如何去做直播电商带货?国仁楠哥
  3. js获取汉字的拼音首字母
  4. Mac安装python3并配置pip
  5. 图扑软件数字孪生厦门隧道,保障隧道运营安全
  6. oracle登录提示01034,ORA-01034: ORACLE not available问题
  7. 【兰陵王系列】服务器租用问题集锦
  8. 四大世界权威大学排名指标及侧重点
  9. 知识蒸馏如何快速提升人工智能模型的性能?
  10. 【MySQL】单表获取库存数