首頁  >  文章  >  後端開發  >  如何解決PHP+trim亂碼問題

如何解決PHP+trim亂碼問題

藏色散人
藏色散人原創
2021-12-14 10:41:552019瀏覽

PHP trim亂碼是因為在PHP中字串函數預設都不是multibyte-safe的,其解決方法就是封裝一個mb_trim函數來解決亂碼即可。

如何解決PHP+trim亂碼問題

本文操作環境:Windows7系統,PHP7.4版,Dell G3電腦。

如何解決PHP trim亂碼問題?

PHP的Trim截斷亂碼

一直使用Trim過濾首尾兩端的字串,關於Trim的官方描述:

trim —去除字串首尾處的空白字元(或其他字元)

今天發現一個很奇怪的問題, 程式碼如下:

<?php
$str = &#39;研发、产品、&#39;;
echo trim($str, &#39;、&#39;);

猜下這個會回傳什麼? “研發、產品”? NO,這個居然很奇怪的返回了「研發、產��」。

難道是我的開啟方式不對,怎麼會回傳亂碼呢。

經過一番測試,發現一個很有趣的問題。

<?php
echo trim(&#39;abacabb&#39;, &#39;ab&#39;);   //print &#39;c&#39;

原本以為這個會回傳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中文網其他相關文章!

陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn