rtrim函數的一個坑

簡述一下今天遇到的問題:
在我的代碼裏面有如下代碼段:

<?php
    header("Content-type:text/html;charset=utf8");
    echo rtrim("威、","、");

本來的預想是輸出“威”。然而事與願違,輸出了幾個亂碼。這是爲什麼呢?容我細細道來。
首先要知道rtrim函數的功能,它的第二個參數是一個string,其中的每個char都會被拿出來作爲將要被去除的字符。比如這樣:

<?php
    echo rtrim("blakefezabc", "cab");
    //output blakefez

是的,輸出結果是blakefez。
這個函數的實現應該也比較簡單:
①、從第一個參數的最後一個字符開始向左遍歷,判斷該字節是否在第二個參數中。
②、如果存在則去掉該字節,繼續第一步。如果不存在,則結束。
請注意,我上面用的是字節。是的,這個函數是非multibyte-safe的函數。也就是說,當我們的參數中有些字符是多字節的,那麼就會產生不想要的結果。比如一開始說的rtrim(“威、”, “、”)。由於”威”和”、”都是utf8編碼的。也就是多字節字符。其中,”威”的編碼是0xE5 0xA8 0x81,”、”的編碼是0xE3 0x80 0x81,所以,在rtrim函數眼裏,它看到的是:rtrim(“0xE5 0xA8 0x81 0xE3 0x80 0x81”, “0xE3 0x80 0x81”);所以最後輸出的結果就是0xE5 0xA8,這時候再轉換爲utf8編碼,就變成亂碼啦。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章