近日接手一個(gè)二開添加翻譯插件的任務(wù),加翻譯插件前網(wǎng)頁(yè)顯示正常,加插件后部分網(wǎng)頁(yè)前部顯示正常,后部顯示亂碼,看起來(lái)與文本編碼不正確差不多。一開始感覺有些無(wú)從下手,仔細(xì)瀏覽網(wǎng)頁(yè)后發(fā)現(xiàn),每次出現(xiàn)亂碼前都有個(gè)不完整的文字,懷疑是文字截取錯(cuò)誤造成了亂碼。
打開源碼,發(fā)現(xiàn)原代碼中使用了substr函數(shù)來(lái)截取字符串。在php中,substr函數(shù)是嚴(yán)格按字節(jié)數(shù)來(lái)截取字符串,雖然一個(gè)中文字符為3個(gè)字節(jié),如果僅以3的倍數(shù)來(lái)進(jìn)行截取,字符串中一旦出現(xiàn)字母、數(shù)字等單字節(jié)字符而沒(méi)有在截取前進(jìn)行判斷處理,就很容易造成出現(xiàn)截取到半個(gè)中文字符的情況。
例如如下代碼,
$str=”活潑楓葉6c的頭條號(hào)”;echo substr($str,0,15);
運(yùn)行的結(jié)果為
活潑楓葉6c
雖然截取的15個(gè)字符,因?yàn)?c兩個(gè)字符只占2個(gè)字節(jié),打亂了字符串的規(guī)律,所以結(jié)果會(huì)出現(xiàn)半個(gè)字符。
說(shuō)到這里,可能有些小伙伴會(huì)想在截取前先對(duì)字符串進(jìn)行一下處理,或者自己寫一個(gè)函數(shù)。其實(shí)大可不必這么麻煩,php已經(jīng)為我們提供了解決方案。
1、按字符數(shù)量截取字符串的mb_substr
例如
$str=”活潑楓葉6c的頭條號(hào)”;echo mb_substr($str,0,7);
運(yùn)行的結(jié)果為
活潑楓葉6c的
需要截取幾個(gè)字,參數(shù)就寫幾個(gè)字,一目了然。
2、按字節(jié)截取字符串的mb_strcut
例如
$str=”活潑楓葉6c的頭條號(hào)”;echo mb_strcut($str,0,15);
運(yùn)行結(jié)果為
活潑楓葉6c
可以看到,雖然mb_strcut也是按字節(jié)截取字符串,但它不會(huì)截?cái)嘧址?/p>
在PHP中,substr雖然用得很多,但要對(duì)中文字符串進(jìn)行截取時(shí),應(yīng)根據(jù)需要選擇mb_substr或mb_strcut,從而避免出現(xiàn)半個(gè)字符亂碼的情況。