PHP trim亂碼是因為在PHP中字串函數預設都不是multibyte-safe的,其解決方法就是封裝一個mb_trim函數來解決亂碼即可。
本文操作環境:Windows7系統,PHP7.4版,Dell G3電腦。
如何解決PHP trim亂碼問題?
PHP的Trim截斷亂碼
一直使用Trim過濾首尾兩端的字串,關於Trim的官方描述:
trim —去除字串首尾處的空白字元(或其他字元)
今天發現一個很奇怪的問題, 程式碼如下:
<?php $str = '研发、产品、'; echo trim($str, '、');
猜下這個會回傳什麼? “研發、產品”? NO,這個居然很奇怪的返回了「研發、產��」。
難道是我的開啟方式不對,怎麼會回傳亂碼呢。
經過一番測試,發現一個很有趣的問題。
<?php echo trim('abacabb', 'ab'); //print 'c'
原本以為這個會回傳acabb的,但居然只回傳了c。這就是對trim函數的誤解了。
其實這個在官方說明文件的Example是有的,只是我沒注意看而已。
trim會循環去掉字串首位存在的字元。如同上面的例子,則執行過程如下:
字串abacabb會從下標0開始循環,如果存在ab中的字元就去掉,一直到沒有就停止循環。
所以執行為:
循環a存在字串ab中,去掉,剩下bacabb
存在字串ab中,去掉,剩下acabb
存在字串ab中,去掉,剩下cabb
循環c不存在字串ab中,停止循環,所以去掉首字元就剩下:cabb。
但是trim是過濾首尾字符,所以也會從結尾循環去掉。
循環b存在字串ab中,去掉,剩下cab,
循環b存在字串ab中,去掉,剩下ca,
循環a存在字串ab中,去掉,剩下c,
循環c不存在字串ab中,停止循環,所以去掉末端字元就剩下:c。
所以整個結束後,abacabb就剩下了c了。看到這裡對trim函數有所了解了吧。
好了,說回亂碼的問題,為什麼會出現回傳亂碼的狀況呢。
這是因為在PHP中,字串函數預設都不是 multibyte-safe 的。如果需要 multibyte-safe 則需要使用mb_系列的函數。
「、」的十六進位碼為0xe3 0x80 0x81,對於不是 multibyte-safe 的函數會把它當作三個字元。
而「品」的十六進位碼為0xe5 0x93 0x81。這裡最後一個0x81剛好符合了,被過濾了。所以才會導致出現亂碼的情況。
ok,問題找到了,trim沒有mb函數,但我們可以自己封裝一個。 Function mb_trim。
PS:用了trim好久了,但一直沒有真正了解。看官方文件還是很重要的。
推薦學習:《PHP影片教學》
以上是如何解決PHP+trim亂碼問題的詳細內容。更多資訊請關注PHP中文網其他相關文章!