簡述今天遇到的問題:
在我的程式碼裡面有以下程式碼段:
<code><span><span><?php</span> header(<span>"Content-type:text/html;charset=utf8"</span>); <span>echo</span> rtrim(<span>"威、"</span>,<span>"、"</span>);</span></code>
原本的預想是輸出「威」。然而事與願違,輸出了幾個亂碼。這是為什麼呢?容我細細道來。
首先要知道rtrim函數的功能,它的第二個參數是一個string,其中的每個char都會被拿出來作為將要被移除的字元。例如這樣:
<code><span><span><?php</span><span>echo</span> rtrim(<span>"blakefezabc"</span>, <span>"cab"</span>); <span>//output blakefez</span></span></code>
是的,輸出結果是blakefez。
這個函數的實作應該也比較簡單:
①、從第一個參數的最後一個字元開始向左遍歷,判斷該位元組是否在第二個參數中。
②、如果存在則去掉該位元組,繼續第一步。如果不存在,則結束。
請注意,我上面用的是位元組。是的,這個函數是非multibyte-safe的函數。也就是說,當我們的參數中有些字元是多位元組的,那麼就會產生不想要的結果。例如一開始說的rtrim(“威、”, “、”)。由於”威”和”、”都是utf8編碼的。也就是多位元組字元。其中,”威”的編碼是0xE5 0xA8 0x81,”、”的編碼是0xE3 0x80 0x81,所以,在rtrim函數眼裡,它看到的是:rtrim(“0xE5 0xA8 0x81 0xE3 0x80 0x813” 0x81”);所以最後輸出的結果就是0xE5 0xA8,這時候再轉換成utf8編碼,就變成亂碼啦。
以上就介紹了 rtrim函數的一個坑,包括了方面的內容,希望對PHP教程有興趣的朋友有所幫助。