PHP使用ltrim、rtrim以及trim处理中文时遇到的“坑”
说坑有点过分,更多的是自己写代码的时候,没有考虑全面,导致自己踩坑了。
案例复现
$source = 'CSDN科技';
$source = rtrim($source, "】");
发现经过rtrim
处理的字符串无法入库,检查后发现数据库报错信息:
General error: 1366 Incorrect string value: ‘xxxxxxx’ for column xxxxx
其实看到这个报错,就能立马意识到问题所在:字符串被不正确的截取,导致数据库驱动无法识别为正确的UTF8编码的文本。
而导致这问题的根本原因是rtrim
以及一系列的方法是二进制安全的。
我们先把最后一个字符技
和】
的字节码打印出来:
var_dump(unpack('C*', '技'));
var_dump(unpack('C*', '】'));
//结果如下
array(3) { [1]=> int(230) [2]=> int(138) [3]=> int(128) } //技
array(3) { [1]=> int(227) [2]=> int(128) [3]=> int(145) } //】
其中的端倪:技
的最后一个字节和】
的第二个字节相同。
trim
方法是二进制安全的,会把】
当做三个字符
去递归处理原始文本,导致技
的最后一个字节被截取,只剩两个字节,已经不是原来的技
了,无法识别。
也就是说,只要原始字符串的尾部字节(包括递归处理后)包含在trim
的第二个参数内,都会被依次递归处理。
下面这段代码跟我们最开始写的那段没有本质区别。
$source = 'anlige';
$source = rtrim($source, "aeb");
解决方案
封装三个mb
开头方法,去处理多字节编码的文本,逻辑比较暴力,代码有待优化。
注意:封装的$char
参数是单个字符,有兴趣也可以修改成递归处理多个字符。
if(!function_exists('mb_ltrim')){function mb_ltrim($str, $char){if(empty($str)) return '';while (mb_substr($str, 0, 1) == $char){$str = mb_substr($str, 1);}return $str;}
}
if(!function_exists('mb_rtrim')){function mb_rtrim($str, $char){if(empty($str)) return '';while (mb_substr($str, -1, 1) == $char){$str = mb_substr($str, 0, -1);}return $str;}
}
if(!function_exists('mb_trim')){function mb_trim($str, $char){return mb_rtrim(mb_ltrim($str, $char), $char);}
}
总结
1、PHP大部分方法都是二进制安全的,因此在使用的时候要注意。
2、并不是二进制安全的方法都会遇到这个问题,主要是trim
系列的特殊处理方式:根据第二个参数传递的值,递归处理首尾字符。
3、遇到问题不可怕,能迅速想到问题的来源和解决方案才最重要的。
PHP使用ltrim、rtrim以及trim处理中文时遇到的“坑”相关推荐
- PHP字符串函数之 trim ltrim rtrim chop
PHP字符串函数之 trim ltrim rtrim chop trim – 去除字符串首尾处的空白字符(或者其他字符) ltrim – 删除字符串开头的空白字符(或其他字符) rtrim – 删除字 ...
- mysql中ltrim用法_LTrim、RTrim 和 Trim 函数的功能及用法
TRIM 函数是用来移除掉一个字串中的字头或字尾.最常见的用途是移除字首或字尾的空白.这个函数在不同的资料库中有不同的名称: MySQL: TRIM(), RTRIM(), LTRIM() oracl ...
- LTRIM、RTRIM和TRIM在ORACLE中的用法:
LTRIM.RTRIM和TRIM在ORACLE中的用法: 1.LTRIM(C1,C2) 其中C1和C2都可以字符串,例如C1是'Miss Liu',C2'MisL'等等.这是第一个和SQL SERVE ...
- php中的rtrim_php中ltrim()、rtrim()与trim()删除字符空格实例
本文实例讲述了php中ltrim().rtrim()与trim()删除字符空格的方法.分享给大家供大家参考.具体分析如下: php中的trim函数不能像asp中的一样,可以自动删除所有空格,PHP专业 ...
- C语言的Trim, LTrim, RTrim
抽空写了个C语言的Trim(), LTrim(), RTrim(),代码如下: #include <iostream> using namespace std; char * LTrim( ...
- [导入]JavaScript常用函数:Trim() LTrim() RTrim()
//功能:JavaScript的Trim(), Ltrim(), RTrim() 函数 //来源:http://jorkin.reallydo.com/article.asp?id=460 Strin ...
- ORACLE中的LTRIM、RTRIM和TRIM
LTRIM.RTRIM和TRIM在ORACLE中的用法: 1.LTRIM(C1,C2) 其中C1和C2都可以字符串,例如C1是'Miss Liu',C2'MisL'等等.这是第一个和SQL SERVE ...
- mysql函数之ltrim(),rtrim(),trim()
mysql函数之ltrim(),rtrim(),trim() 提前总结: ltrim():去除字符串左边的空格 rtrim():去除字符串右边的空格 trim(): 去除字符串两边的空格 ltrim( ...
- php之 trim ltrim rtrim 小坑
trim, ltrim, rtrim , 有第二个参数,可以指定过滤的字符 小坑demo: //ltrim区分左边的 间隔就是右边第一个字符, 这样写没有可读性 $str = "qwerty ...
最新文章
- dd linux 尾部添加0_Linux文件目录命令整理Linux学习
- [C#]泛型与非泛型集合类的区别及使用例程,包括ArrayList,Hashtable,ListT,DictionaryTkey,Tvalue,SortedListTkey,Tvalue,...
- jersey客户端_项目学生:带有Jersey的Web服务客户端
- 自己动手写符合自己业务需求的eslint规则
- url中找出IP地址
- python图像处理模块_Python图像处理库PIL的ImageEnhance模块使用介绍
- jquery.alerts.js模拟js的alert,confirm的插件
- Python 标准库和第三方库的安装位置、Python 第三方库安装的各种问题及解决
- 河南网通帐号在线转换工具
- mysql返回上一层_mysql常用命令大全
- NodeJS 服务 Docker 镜像极致优化指北
- pandas绘图plot函数
- GNU Make 使用手册!
- Consul 集群单节点与多节点
- java dispatcher详解_Java Web开发详解:RequestDispatcher接口
- PostgreSQL数据库锁机制——SpinLock
- 标准代码及数据字典的实现
- 最小编辑距离 动态规划 python
- CSP-JS全套认证须知
- 机器人教育在学校普及
热门文章
- web攻击(Linux服务器)
- 2022-2028全球与中国硼硅酸盐玻璃管市场现状及未来发展趋势
- android 框架 Afinal 解析
- 基于JAVA悦途旅游网计算机毕业设计源码+系统+数据库+lw文档+部署
- 华为200万薪酬招聘博士生,扩招1万名应届生!IT高薪越来越容易?
- python读取文本两个数字的成语_R 和 Python 中的文本挖掘:8 个入门小贴士
- eBay Trading API 整理
- 23个Python爬虫开源项目代码:爬取微信、淘宝、豆瓣、知乎、微博
- android蓝牙 相机,android – 如何通过蓝牙访问相机?
- 个人消费管理系统(C语言)