PHP使用ltrim、rtrim以及trim处理中文时遇到的“坑”

这篇具有很好参考价值的文章主要介绍了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、遇到问题不可怕,能迅速想到问题的来源和解决方案才最重要的。文章来源地址https://www.toymoban.com/news/detail-430202.html

到了这里,关于PHP使用ltrim、rtrim以及trim处理中文时遇到的“坑”的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 前端遇到302处理方式以及设置第三方Cookie研究

    背景:由于认证中心网关检测到用户是未登录态情况下的话,会将用户重定向到认证中心的登录页。 ​ 此时,假如是使用Oauth2协议,登录成功后,前端需要带着登录成功的信息(jwt),访问/Oauth2/1/authorize接口,此时该接口将会重定向回redirect_uri的地址,这个时候的 重点在于

    2024年02月11日
    浏览(37)
  • pikachu安装以及安装时遇到的的问题——pikachu数据库链接不上config.inc.php 以及侧边栏访问没有反应,只有URL加了个#原因和解决办法

     下载链接        使用phpstudy搭建渗透测试靶场环境_Gjqhs的博客-CSDN博客 下载解压到以下WWW路径里 修改这俩文件 访问 按照提示链接即可 1、检查下config目录下的config.php是否存在,如果没有config.php文件,,就把config文件夹下其他文件清空install.link删掉。然后访问install.ph

    2024年02月13日
    浏览(45)
  • nginx处理cros跨域遇到的各种问题及解决方案,以及https配置和浏览器https不安全问题处理

    提示:本人在生产部署服务时遇到一系列跨域问题和https配置问题,特此做以下记录: 跨域是指a页面想获取b页面资源,如果a、b页面的协议、域名、端口、子域名不同,或是a页面为ip地址,b页面为域名地址,所进行的访问行动都是跨域的,而浏览器为了安全问题一般都限制了

    2024年02月02日
    浏览(64)
  • mybatis trim标签使用详解

    mybatis的trim标签一般用于去除sql语句中多余的and,逗号,或者给sql语句前拼接 “where“、“set“以及“values(“ 等前缀,或者添加“)“等后缀,可用于选择性插入、更新、删除或者条件查询等操作。 以下是trim标签中涉及到的属性: prefix=添加前缀 suffix=添加后缀 prefix

    2024年02月06日
    浏览(46)
  • Linux下安装ElasticSearch-analysis-ik中文分词器插件,以及可能出现的异常处理

            注意:安装可以采用在线方式、离线方式,但是不建议在线安装,速度超级慢,本文只介绍离线安装方式                 下载地址:https://github.com/medcl/elasticsearch-analysis-ik                 切记选择版本需要跟ElasticSearch保持一致,否则可能会出现一些未知的异

    2024年02月07日
    浏览(68)
  • windows下的git 安装与使用以及可能遇到问题

    一、安装部分: 首先关于git安装,直接从官网下载即可下载地址为:Git - Downloads (git-scm.com) 安装上面没什么需要注意的,一路next下来即可。 二、环境配置: 1.安装好之后设置姓名和邮箱 (注意这里的邮箱和姓名为github官网GitHub注册所使用的邮箱以及用户名) 设置方式为使

    2024年03月23日
    浏览(55)
  • pdfh5.js的使用以及遇到的坑

    pdfh5的地址: https://www.npmjs.com/package/pdfh5 在项目中引入pdfh5 完成事件on函数的事件名 遇到的坑 引入css的坑 在引入css文件的时候,官方给出了两种方式 第一种:在style标签里面通过@import \\\'pdfh5/css/pdfh5.css’方式,这种方式可能会报错 第二种:在script标签里面通过import ‘pdfh5/c

    2024年02月11日
    浏览(41)
  • 使用Jenkins处理自动化遇到的问题

    先简单写下,下次再补 1.本机运行 shell 没问题, Jenkins 运行shell报错,找不到命令 本机环境变量与Jenkins运行的环境变量不一致,在系统配置里面设置Jenkins环境变量 key=PATH value = $PATH:XXX XXX表示要你要加的环境变量,有多个用冒号隔开, 最好的办法就是把mac上的环境变量复制过

    2024年02月12日
    浏览(39)
  • arcmap如何使用PyScripter进行编辑 以及使用过程中遇到的无法解码问题

    一、环境配置 1.安装PyScripter 安装文件连接: 链接:https://pan.baidu.com/s/1HauyVCs6UoXLFam0nkRtxA 提取码:a6c3 2.arcmap内配置环境 菜单栏,地理处理 ----  地理处理选项 ---- 将脚本工具编辑器和调试程序均设置为 安装PyScripter路径下的启动程序   3.检测 找到自己所建的Python脚本 ---- 右击

    2024年02月08日
    浏览(38)
  • 在 VScode 终端上创建 nuxtjs 项目遇到的问题以及使用 GitHub 遇到的问题和一些个人笔记

    这篇文章是关于在vscode终端中创建 nuxtjs项目 的一些步骤,同时还包括了使用 Git、GitHub 的一些操作,以此文章作为笔记,仅供参考。(前提:已经安装nodejs、git) 关于nuxtjs、ssr、服务端渲染、nuxtjs项目结构等等相关知识点这篇文章就不多多介绍了,在后续的文章或笔记中也

    2024年02月09日
    浏览(74)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包