天天看點

PHP 源碼探秘 - 為什麼 trim 會導緻亂碼科普原理源碼探究解決方案PHP7 相關源碼

運作以下代碼:

我們可能以為會得到的結果是<code>網際網路産品</code>,實際結果是<code>網際網路産�</code>。為什麼會這樣呢?

比如

<code>mb_</code>系列函數是以“多個位元組組成的一個字元”為顆粒度來操作的,不帶<code>mb_</code>則是按實際的位元組數來操作的。

<code>trim</code> 函數文檔

該函數不是多位元組函數,也就是說,漢字這樣的多位元組字元,會拿其頭或尾的單位元組來和後面的<code>$character_mask</code>對應的char數組進行比對,如果在後面的數組中,則删掉,繼續比對。比如:

如下面的 demo 中的函數<code>string_print_char</code>所示:

<code>、</code>由<code>0xe3 0x80 0x81</code>三位元組組成,

<code>品</code>由<code>0xe5 0x93 0x81</code>三位元組組成。

是以在執行<code>rtrim</code>的時候,通過位元組比對,會将<code>0x81</code>去掉,導緻了最後出現了亂碼。

檢視 PHP7 的源碼,然後提煉出下面的小 demo ,友善大家一起學習,其實PHP源碼的學習并不難,每天進步一點點。

如果覺得 demo 還不夠清晰的,複制下來,自己執行一次吧~

C 語言基礎較差的同學也不用擔心,我準備後面專門寫一個PHP小白學習 C 語言的系列入門短文哈。

那麼我們就依葫蘆畫瓢,用 php 本身的多位元組函數來實作下吧:

當然你也可以使用正則來做。通過上面的函數學習,單位元組函數和多位元組函數,你學會了嗎?