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方法来获取想要的值
声明:版权所有,违者必究 | 如未注明,均为原创 | 本网站采用 BY-NC-SA 协议进行授权
转载:转载请注明原文链接,违者必究 - :https://wolfcode.net/info/145/