rtrim函數的一個坑

WBOY
發布: 2016-07-28 08:25:48
原創
1143 人瀏覽過

簡述今天遇到的問題:
在我的程式碼裡面有以下程式碼段:

<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編碼,就變成亂碼啦。

').addClass('pre-numbering').hide(); $(this).addClass('has-numbering').parent().append($numbering); for (i = 1; i ').text(i)); }; $numbering.fadeIn(1700); }); });

以上就介紹了 rtrim函數的一個坑,包括了方面的內容,希望對PHP教程有興趣的朋友有所幫助。

相關標籤:
來源:php.cn
本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn
熱門教學
更多>
最新下載
更多>
網站特效
網站源碼
網站素材
前端模板
關於我們 免責聲明 Sitemap
PHP中文網:公益線上PHP培訓,幫助PHP學習者快速成長!