當前位置: 首頁> 最新文章列表> 使用mb_get_info 解決字符編碼轉換中的亂碼問題

使用mb_get_info 解決字符編碼轉換中的亂碼問題

gitbox 2025-05-11

在開發多語言網站或處理外部數據源時,字符編碼的混亂經常讓人頭疼。如果編碼設置不對,輕則出現亂碼,重則數據丟失、功能異常。
在PHP 中, mbstring擴展提供了很多處理多字節字符的函數,其中mb_get_info()是定位編碼問題的一個非常好用的利器。

什麼是mb_get_info()

mb_get_info()是PHP mbstring擴展中的一個函數,用來獲取當前多字節字符串處理的配置信息。
它可以返回當前的內部編碼、HTTP 輸入/輸出編碼、語言設置等內容,幫助我們快速了解腳本當前的編碼環境。

函數簽名非常簡單:

 array mb_get_info ([ string $type = "all" ] )

如果不傳參數,默認返回所有配置信息。如果傳一個類型,比如"internal_encoding" ,則只返回對應的信息。

為什麼字符編碼會導致亂碼?

PHP 默認情況下對字符編碼不太“敏感”,尤其是處理UTF-8、GBK、Shift-JIS 這類多字節編碼時,稍微處理不當就會出現亂碼。
常見的原因有:

  • 輸入的編碼和腳本處理的編碼不一致

  • 輸出的編碼設置錯誤

  • 數據庫連接時編碼設置錯誤

  • 服務器默認語言環境設置問題

這時候,如果你不知道當前環境具體使用了什麼編碼,就很難對症下藥。而mb_get_info()正好可以幫我們查清楚。

如何用mb_get_info()排查亂碼?

下面是一個簡單的示例,演示如何用mb_get_info()來定位問題:

 <?php
// 查看當前多字節處理的所有配置
$info = mb_get_info();
print_r($info);

// 重點查看內部編碼
echo "Internal Encoding: " . mb_internal_encoding() . PHP_EOL;

// 設置編碼為 UTF-8,避免亂碼
mb_internal_encoding("UTF-8");

// 再次查看
echo "New Internal Encoding: " . mb_internal_encoding() . PHP_EOL;
?>

輸出結果可能類似於:

 Array
(
    [internal_encoding] => UTF-8
    [http_output] => UTF-8
    [http_input] => UTF-8
    [language] => neutral
    ...
)
Internal Encoding: UTF-8
New Internal Encoding: UTF-8

如果你發現internal_encoding不是UTF-8 (比如是ISO-8859-1 ),那麼大概率就是亂碼源頭了。
直接用mb_internal_encoding("UTF-8")重新設定,就可以避免繼續發生亂碼問題。

實戰案例:防止亂碼輸出到網頁

假設你有一個簡單的接口,返回用戶輸入的內容到前端,像這樣:

 <?php
header('Content-Type: text/html; charset=UTF-8');

// 檢查當前內部編碼
if (mb_internal_encoding() !== 'UTF-8') {
    mb_internal_encoding('UTF-8');
}

// 假設用戶輸入(可能來自表單、接口等)
$user_input = "你好,世界!";

// 輸出
echo htmlspecialchars($user_input, ENT_QUOTES, 'UTF-8');
?>

在這裡,即使用戶提交的是其他編碼,比如GB2312,服務器統一處理成UTF-8 後輸出,就可以大大降低亂碼概率。
如果需要更全面的編碼檢測,還可以配合mb_detect_encoding()使用,自動識別並轉換。

額外補充:文檔地址

如果想了解更多mb_get_info()mbstring的用法,可以參考官方文檔:
https://gitbox.net/php/manual/zh/function.mb-get-info.php