mbstring擴充套件導致中文亂碼

2022-04-09 04:30:02 字數 1506 閱讀 5328

本文目的

mbstring是php的乙個標準擴充套件,源**在php_src/ext/mbstring中。主要用於處理多位元組編碼的字串,如utf-8,gbk等。php內建的字串處理函式(如strlen等)將字串當作位元組陣列處理,如果直接用來處理中文,可能會導致中文亂碼(中文編碼方式可以參考這篇文章《網頁中文亂碼的那些事兒》)。但是,如果mbstring使用不當,也會導致亂碼現象。最近就遇到這個問題,所以記錄下來,作為備忘。

亂碼現象

看看下面的**:

<?php 

/** * 清除所有常見標點符號

*/function clear_point($pointer) 。「」]+', ' ', $pointer);

}$str = '今天, 是個《好日 子》。「不 【是嗎】';

echo "原始字串 :''", php_eol;

$stripped = clear_point($str);

echo "處理後的字串:''", php_eol;

上面的**主要是將字串中的標點剔除(php指令碼需要使用utf-8編碼),執行結果如下:

出現亂碼了。

原因&解決方法

導致原因很簡單,雖然你使用了mbstring庫中的函式處理多位元組字串,但是php仍然不知道被處理的字串是什麼編碼。可以使用命令」php –i | grep mbstring」來看看相關配置,如下圖:

預設的mbstring.internal_encoding的值為『no value』,說明沒有明確表示php源**是以何種方式編碼,從而導致了錯誤的處理方式,亂碼很容易發生。

問題關鍵在於設定mbstring.internal_encoding,給出明確的編碼規則。修改後,如下圖所示(此配置在php.ini中):

修改後,再執行命令「php –i | grep mbstring」,得到如下結果,表示修改生效:

再次執行上面的程式,得到如下結果:

沒有亂碼,處理後的字串將標點全部剔除。

參考資料

adb shell windows系統中文亂碼

參巧 在cmd下 1 chcp顯示936結果,2 chcp 65001 3 重啟adb shell目錄顯示中文還是亂碼。參巧 通過 adb shell 登入到 nook shell 後,列目錄的時候,如果有中文會亂碼。這是因為 nook 輸出是 utf8,而 windows的console 是系統缺...

Ubuntu Rhythmbox 解決中文亂碼

在這裡介紹的是乙個解決方法,修改變數。在終端輸入 gedit profile 在最後加入下面內容 exportgst id3 tag encoding gbk utf 8 gb18030 exportgst id3v2 tag encoding gbk utf 8 gb18030 儲存退出。sour...

解決 Flask sqlalchemy 中文亂碼

當在使用 flask sqlalchemy 操作 mysql 資料庫時中文亂碼或者直接報錯。解決方法如下 from flask sqlalchemy import sqlalchemy db sqlalchemy use native unicode utf8 配置 mysql 預設字元編碼為 ut...