PHP字符编码判断猝不及防之坑

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

小马曾经有讲过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'));嗯,似乎案子就这样破了。
image.png

这是当时的卷宗

新的惊天秘密

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

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

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

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

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


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

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

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

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

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

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

那么对于PHP该怎么处理对于汉字字母数字的校验呢?正确的打开方式是什么呢?您有什么高见呢?欢迎讨论指点。

相关文章
|
JSON PHP 数据格式
【python】or【php】网页中字符编码转换,将反斜杠u \u字符串转为unicode/utf8
【python】or【php】网页中字符编码转换,将反斜杠u \u字符串转为unicode/utf8
347 0
|
PHP
php转换文本编码,php字符编码转换,php编码转换
php转换文本编码,php字符编码转换,php编码转换
175 0
|
3月前
|
关系型数据库 MySQL PHP
PHP和Mysql前后端交互效果实现
本文介绍了使用PHP连接MySQL数据库的基本函数及其实现案例。内容涵盖数据库连接、选择数据库、执行查询、获取结果等常用操作,并通过用户登录和修改密码的功能实例,展示了PHP与MySQL的交互过程及代码实现。
308 0
PHP和Mysql前后端交互效果实现
|
8月前
|
关系型数据库 MySQL Linux
查看Linux、Apache、MySQL、PHP版本的技巧
以上就是查看Linux、Apache、MySQL、PHP版本信息的方法。希望这些信息能帮助你更好地理解和使用你的LAMP技术栈。
417 17
|
前端开发 关系型数据库 MySQL
PHP与MySQL动态网站开发实战指南####
【10月更文挑战第21天】 本文将深入浅出地探讨如何使用PHP与MySQL构建一个动态网站,从环境搭建到项目部署,全程实战演示。无论你是编程新手还是希望巩固Web开发技能的老手,都能在这篇文章中找到实用的技巧和启发。我们将一起探索如何通过PHP处理用户请求,利用MySQL存储数据,并最终呈现动态内容给用户,打造属于自己的在线平台。 ####
547 0
|
9月前
|
关系型数据库 MySQL PHP
源码编译安装LAMP(HTTP服务,MYSQL ,PHP,以及bbs论坛)
通过以上步骤,你可以成功地在一台Linux服务器上从源码编译并安装LAMP环境,并配置一个BBS论坛(Discuz!)。这些步骤涵盖了从安装依赖、下载源代码、配置编译到安装完成的所有细节。每个命令的解释确保了过程的透明度,使即使是非专业人士也能够理解整个流程。
272 18
|
10月前
|
关系型数据库 MySQL 网络安全
如何排查和解决PHP连接数据库MYSQL失败写锁的问题
通过本文的介绍,您可以系统地了解如何排查和解决PHP连接MySQL数据库失败及写锁问题。通过检查配置、确保服务启动、调整防火墙设置和用户权限,以及识别和解决长时间运行的事务和死锁问题,可以有效地保障应用的稳定运行。
410 25
|
SQL 关系型数据库 MySQL
PHP与MySQL的高效交互:从基础到实践####
本文深入探讨了PHP与MySQL数据库之间的高效交互技术,涵盖了从基础连接到高级查询优化的全过程。不同于传统的摘要概述,这里我们直接以一段精简代码示例作为引子,展示如何在PHP中实现与MySQL的快速连接与简单查询,随后文章将围绕这一核心,逐步展开详细讲解,旨在为读者提供一个从入门到精通的实战指南。 ```php <?php // 数据库配置信息 $servername = "localhost"; $username = "root"; $password = "password"; $dbname = "test_db"; // 创建连接 $conn = new mysqli($se
324 31