rtrim函式的乙個坑

2021-07-15 07:06:37 字數 814 閱讀 2776

簡述一下今天遇到的問題:

在我的**裡面有如下**段:

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

PHP函式 rtrim 的乙個怪異現象

今天用rtrim 函式時遇到了乙個奇怪的問題 echo rtrim 輸出為 以上的輸出結果有點出人意料,本來我想第一行應該輸出,第二行會輸出cnblogs.com。這個問題糾結了我好久,一直沒有找到原因,後來在手冊中找到了答案 rtrim 是以字元為單位替換,而不是以字串的。從右往左替換時 6個字元...

乙個函式呼叫模式的小坑

昨天覆習了下閉包,遇到乙個思考題,糾結了好久,才發現自己基礎原來那麼差。貼出來 var name the window var object alert object.getnamefunc the window我掉進了閉包的坑里,為啥返回的函式就不能維持this的值呢。這裡只提到函式呼叫模式,和方...

乙個memset函式使用時的坑

平時使用memset函式都是用來初始化字串,從來沒有注意過它具體是怎麼實現的,最近無意中發現原來這個函式裡面還是有坑的。我嘗試用它來初始化整型陣列 int array 10 memset array,1,sizeof a 我原本是想將陣列元素全部初始化為1,可是卻是這樣的 一開始不明白為什麼會這樣,...