PHP trim方法遇到的坑

先上一段代码:

$a = "互联网产品、";
$b = trim($a, "、");
var_dump($b);

你的心里预想会打印什么值呢?

是不是=>"互联网产品"

可现实打印的是

string(14) "互联网产�"

可能到这里有很多人怀疑是不是中文的问题?

那么接着往下看:

$a = "table?type=4";
$b = trim($a, "?type=4");
var_dump($b);

你的心里预想会打印什么值呢?

是不是=>"table"

可现实打印的是

string(3) "abl"

What?Why?

看看PHP官方对trim方法的解释:

trim ( string $str [, string $character_mask = " \t\n\r\0\x0B" ] ) : string

此函数返回字符串 str 去除首尾空白字符后的结果。如果不指定第二个参数,trim() 将去除这些字符:

" " (ASCII 32 (0x20)),普通空格符。

"\t" (ASCII 9 (0x09)),制表符。

"\n" (ASCII 10 (0x0A)),换行符。

"\r" (ASCII 13 (0x0D)),回车符。

"\0" (ASCII 0 (0x00)),空字节符。

"\x0B" (ASCII 11 (0x0B)),垂直制表符。

好像...看不大懂!!!

简单的说,中文过滤时候,因为字节的原因,“品”字中的部分字节跟“、”的部分字节重复,被过滤掉了,剩下的字节不足以拼接成一个中文,然后就乱码了。

、 由0xe3 0x80 0x81三字节组成,
品 由0xe5 0x93 0x81三字节组成。

同理,英文中的部分字节相同也被过滤了?【英文是我个人的怀疑...】

建议:

项目中尽量少用trim、ltrim、rtrim方法来获取最终值

提倡使用正则匹配或者数组切割explode方法来获取想要的值