今天博主在網上看php面試題的時候,看到了這麼乙個問題,如何實現字串反轉,當時想不是有乙個內建函式strrev能實現這個功能嗎?後來試了一下,這個函式只能對英文本元進行反轉,對中文會有亂碼出現。主要原因還是編碼上的問題。
php中utf-8編碼中文當作3個位元組計算,gb2312當作2個位元組計算。所以想要實現中文字串的一些功能,首先就要解決編碼問題。
今天這個功能就是從編碼處下手的。接下來開始講實現的功能,今天要用到這麼幾個函式:
1
2
3
4
5
is_string
()
//判斷引數是否為字串,這個大家應該都知道
mb_check_encoding()
//用來檢查給定的字串是否屬於指定的編碼
mb_strlen()
//用來獲取字串長度
mb_substr()
//用來擷取字串中的字元
krsort()
//將陣列按鍵名由大到小排序上述
上面用到了3個mb開頭的函式,mb開頭的函式都是用於處理多位元組字串的,主要是能指定字串編碼。
mb_check_encoding()接受兩個引數,第乙個引數要是字串,第二個引數是輸入乙個字元編碼,然後判斷該字串是否屬於該編碼,返回乙個bool值,若省略第二個引數則預設為內部編碼,可通過mb_internal_encoding()檢視。
mb_strlen()有兩個引數,第乙個是字串內容,第二個是字串的編碼。
mb_substr()有四個引數,第乙個是要擷取的字串內容,第二個是開始擷取的位置,第三個是擷取的長度,第四個是字串的編碼(在本例中要選擇utf-8,其他編碼都不會得到正確的結果)。
接下來就是完整的**了,簡略的注釋都已經標註好了,其實只要看一遍都能看懂:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
<?php
header(
"content-type:text/html;charset=utf-8"
);
$s
=
"這是我的技術部落格,歡迎多多來訪!"
;
function
str_rev(
$str
)
//用mb_strlen函獲取算utf8字串的長度
$length
=mb_strlen(
$str
,
"utf-8"
);
//宣告乙個陣列備用
$arr
=
array
();
//將字串拆開放入陣列
for
(
$i
=0;
$i
<
$length
;
$i
++)
//將陣列按鍵名大小反轉
krsort(
$arr
);
//將陣列中單個字元元素重新組合成字串
$str
=implode(
""
,
$arr
);
//將翻轉後的字串返回
return
$str
;
}
echo
$s
.
"
";
echo
str_rev(
$s
);
/* 得到結果:
* 這是我的技術部落格,歡迎多多來訪!
* !訪來多多迎歡,客博術技的我是這
*/
?>
如果文中有任何錯誤,敬請指出,以便完善。
PHP反轉中文字串
如何翻轉乙個中文字串?如 str 天氣真好 字串反轉函式strrev 是乙個單位元組反轉的函式。對於多位元組編碼的中文字元,不能正常使用。因此,這個問題就涉及到php國際化與字元編碼支援。使用多位元組字串函式可以很好解決這個問題。header content type text html chars...
php中文字串反轉
1 2header content type text html charset utf 8 3 4此函式的作用是反轉中文字串 5mb strlen 獲取字元的長度 6mb substr 獲取字元的單個元素 7krsort 按照鍵值逆序排序陣列 8implode 將陣列拼接為字串 9explode ...
php函式strrev 反轉中文字串亂碼的問題
解決辦法 先把中文字串打散成陣列,然後用krsort 函式對陣列按鍵名降序排序,排好序之後再用implode 或join 函式將陣列合併成字串。header content type text html charset utf 8 str 反轉中文 str arr ch2arr str 將中文字串打...