说坑有点过分,更多的是自己写代码的时候,没有考虑全面,导致自己踩坑了。

案例复现

$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处理中文时遇到的“坑”相关推荐

  1. PHP字符串函数之 trim ltrim rtrim chop

    PHP字符串函数之 trim ltrim rtrim chop trim – 去除字符串首尾处的空白字符(或者其他字符) ltrim – 删除字符串开头的空白字符(或其他字符) rtrim – 删除字 ...

  2. mysql中ltrim用法_LTrim、RTrim 和 Trim 函数的功能及用法

    TRIM 函数是用来移除掉一个字串中的字头或字尾.最常见的用途是移除字首或字尾的空白.这个函数在不同的资料库中有不同的名称: MySQL: TRIM(), RTRIM(), LTRIM() oracl ...

  3. LTRIM、RTRIM和TRIM在ORACLE中的用法:

    LTRIM.RTRIM和TRIM在ORACLE中的用法: 1.LTRIM(C1,C2) 其中C1和C2都可以字符串,例如C1是'Miss Liu',C2'MisL'等等.这是第一个和SQL SERVE ...

  4. php中的rtrim_php中ltrim()、rtrim()与trim()删除字符空格实例

    本文实例讲述了php中ltrim().rtrim()与trim()删除字符空格的方法.分享给大家供大家参考.具体分析如下: php中的trim函数不能像asp中的一样,可以自动删除所有空格,PHP专业 ...

  5. C语言的Trim, LTrim, RTrim

    抽空写了个C语言的Trim(), LTrim(), RTrim(),代码如下: #include <iostream> using namespace std; char * LTrim( ...

  6. [导入]JavaScript常用函数:Trim() LTrim() RTrim()

    //功能:JavaScript的Trim(), Ltrim(), RTrim() 函数 //来源:http://jorkin.reallydo.com/article.asp?id=460 Strin ...

  7. ORACLE中的LTRIM、RTRIM和TRIM

    LTRIM.RTRIM和TRIM在ORACLE中的用法: 1.LTRIM(C1,C2) 其中C1和C2都可以字符串,例如C1是'Miss Liu',C2'MisL'等等.这是第一个和SQL SERVE ...

  8. mysql函数之ltrim(),rtrim(),trim()

    mysql函数之ltrim(),rtrim(),trim() 提前总结: ltrim():去除字符串左边的空格 rtrim():去除字符串右边的空格 trim(): 去除字符串两边的空格 ltrim( ...

  9. php之 trim ltrim rtrim 小坑

    trim, ltrim, rtrim , 有第二个参数,可以指定过滤的字符 小坑demo: //ltrim区分左边的 间隔就是右边第一个字符, 这样写没有可读性 $str = "qwerty ...

最新文章

  1. dd linux 尾部添加0_Linux文件目录命令整理Linux学习
  2. [C#]泛型与非泛型集合类的区别及使用例程,包括ArrayList,Hashtable,ListT,DictionaryTkey,Tvalue,SortedListTkey,Tvalue,...
  3. jersey客户端_项目学生:带有Jersey的Web服务客户端
  4. 自己动手写符合自己业务需求的eslint规则
  5. url中找出IP地址
  6. python图像处理模块_Python图像处理库PIL的ImageEnhance模块使用介绍
  7. jquery.alerts.js模拟js的alert,confirm的插件
  8. Python 标准库和第三方库的安装位置、Python 第三方库安装的各种问题及解决
  9. 河南网通帐号在线转换工具
  10. mysql返回上一层_mysql常用命令大全
  11. NodeJS 服务 Docker 镜像极致优化指北
  12. pandas绘图plot函数
  13. GNU Make 使用手册!
  14. Consul 集群单节点与多节点
  15. java dispatcher详解_Java Web开发详解:RequestDispatcher接口
  16. PostgreSQL数据库锁机制——SpinLock
  17. 标准代码及数据字典的实现
  18. 最小编辑距离 动态规划 python
  19. CSP-JS全套认证须知
  20. 机器人教育在学校普及

热门文章

  1. web攻击(Linux服务器)
  2. 2022-2028全球与中国硼硅酸盐玻璃管市场现状及未来发展趋势
  3. android 框架 Afinal 解析
  4. 基于JAVA悦途旅游网计算机毕业设计源码+系统+数据库+lw文档+部署
  5. 华为200万薪酬招聘博士生,扩招1万名应届生!IT高薪越来越容易?
  6. python读取文本两个数字的成语_R 和 Python 中的文本挖掘:8 个入门小贴士
  7. eBay Trading API 整理
  8. 23个Python爬虫开源项目代码:爬取微信、淘宝、豆瓣、知乎、微博
  9. android蓝牙 相机,android – 如何通过蓝牙访问相机?
  10. 个人消费管理系统(C语言)