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

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

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

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

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

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

《L03 构架 API 服务器》
你将学到如 RESTFul 设计风格、PostMan 的使用、OAuth 流程,JWT 概念及使用 和 API 开发相关的进阶知识。
《L02 从零构建论坛系统》
以构建论坛项目 LaraBBS 为线索,展开对 Laravel 框架的全面学习。应用程序架构思路贴近 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年前 评论

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