php 基础函数 ltrim 处理中文问题

今天写代码时遇到一个问题,如图所示

php 基础函数 ltrim 处理中文问题

很明显「啊」这个字被 “吞” 掉了一个字符,搜索半天未能分析其原因。

ps: 不是找解决方案,我知道替代方案,发这个贴就是想问下 ltrim 为什么会出现这个问题。ps: 不是找解决方案,我知道替代方案,发这个贴就是想问下 ltrim 为什么会出现这个问题。

另外顺便问下,我这里怎么没有提个问题了,我还是找浏览器历史记录才发出这个问题。
php 基础函数 ltrim 处理中文问题

《L05 电商实战》
从零开发一个电商项目,功能包括电商后台、商品 & SKU 管理、购物车、订单管理、支付宝支付、微信支付、订单退款流程、优惠券等
《G01 Go 实战入门》
从零开始带你一步步开发一个 Go 博客项目,让你在最短的时间内学会使用 Go 进行编码。项目结构很大程度上参考了 Laravel。
讨论数量: 5
yema

str_replace('河南省郑州市金水区','','河南省郑州市金水区啊啊')

2年前 评论

file
仔细审题呀兄弟,我也能列出 N 种替代方案,但是发出此贴主要还是想知道为什么 ltrim 会出错。@yema

2年前 评论

多字节编码导致的,涉及中文和英文的操作函数都推荐使用 mb_ 前缀函数。

2年前 评论
荒街! (楼主) 2年前
梧桐树下 (作者) 2年前
荒街! (楼主) 2年前
梧桐树下 (作者) 2年前

说一下我的想法:trim的第二个参数其实是字符列表,而trim函数其实并不认unicode字符,因此它会按照固定的字节数依次读取这个中文字符串,而“啊啊”第一个“啊”的前半部分unicode编码满足了trim解析的这个列表中的数据,因此被trim掉了,而“啊”unicode编码的后半部分并不满足这个列表中的任何一个部分,因此被保留下来,从而成为了乱码。

2年前 评论
荒街! (楼主) 2年前
荒街! (楼主) 2年前

@dengminfeng 启发,将 转换为 字节 后,得出 0xe5 0x8c 0xba 三字节组成,而 则是由 0xe5 0x95 0x8a 组成,由于有共同的 0xe5,所以会多除去一个字节,导致乱码。

同时发现,所有中文字符的第一字节均为 0xe50xe6,所以 "区" 后无论跟任何中文字符,都会多除去一个字节。

2年前 评论

讨论应以学习和精进为目的。请勿发布不友善或者负能量的内容,与人为善,比聪明更重要!