首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> 網頁程式設計 >> PHP 程式設計 >> PHP 綜合知識

PHP 陣列編碼 GBK 與 UTF-8 互轉的兩種高效實現方案

     編輯:PHP 綜合知識

前言

在 PHP 開發中,處理多種字符編碼共存的場景時常遇到,特別是早期項目遷移或對接第三方接口時,陣列編碼轉換是繞不開的話題。本文將介紹兩種實用的陣列編碼轉換方法,幫助開發者輕鬆解決 GBK 與 UTF-8 互轉難題。

方法一:利用 var_export() 與 eval() 組合轉換

這種方法的核心思路是將陣列序列化為 PHP 代碼字符串,進行編碼轉換後再通過 eval() 執行還原。雖然聽起來有些「駭客感」,但實際操作非常簡潔有效。

/**
 * 將含有 GBK 編碼的中文陣列轉為 UTF-8
 *
 * @param array  $arr         待轉換陣列
 * @param string $in_charset  原編碼,預設 gbk
 * @param string $out_charset 目標編碼,預設 utf-8
 * @return array 轉換後的陣列
 */
function array_iconv($arr, $in_charset = "gbk", $out_charset = "utf-8") {
    // var_export 第二參數為 true 時返回代碼字符串而非直接輸出
    $code = var_export($arr, true);
    // 對代碼字符串進行編碼轉換
    $code = iconv($in_charset, $out_charset, $code);
    // 執行代碼字符串還原陣列
    $ret = eval('return ' . $code . ';');
    return $ret;
}

原理解析

  1. var_export($arr, true) 將陣列導出為合法的 PHP 代碼字符串(如 array (0 => '中文',))
  2. iconv() 對該字符串進行編碼轉換
  3. eval() 執行字符串代碼並返回陣列結構

eval() 關鍵注意事項

  • 字符串必須是合法 PHP 代碼,且以分號結尾
  • 若無 return 語句則返回 NULL
  • 解析錯誤時返回 false
// eval() 使用示例
$a = "hello";
$res = eval("return $a;");  // 返回 "hello"
print_r($res);

// 變量賦值需轉義 $ 符號
eval("\$str = \"$str\";");
echo $str;

方法二:遞歸遍歷逐元素轉換

這是更傳統、更安全的方法,通過遞歸遍歷陣列對每個字符串值單獨進行編碼轉換,支援多維陣列且不依賴 eval()。

/**
 * UTF-8 與 GBK 編碼相互轉換(支援多維陣列)
 *
 * @param mixed  $str         字符串或陣列
 * @param string $in_charset  原編碼
 * @param string $out_charset 目標編碼
 * @return mixed 轉換後的值
 */
function array_iconv($str, $in_charset = "gbk", $out_charset = "utf-8") {
    if (is_array($str)) {
        foreach ($str as $k => $v) {
            // 遞歸處理子元素
            $str[$k] = array_iconv($v, $in_charset, $out_charset);
        }
        return $str;
    } elseif (is_string($str)) {
        // 推薦使用 mb_convert_encoding,支援更多編碼且效能更好
        return mb_convert_encoding($str, $out_charset, $in_charset);
        // 或者使用 iconv:return iconv($in_charset, $out_charset . '//IGNORE', $str);
    } else {
        // 非字符串類型(數值、布爾、null 等)直接返回
        return $str;
    }
}

遞歸方案優勢

  • 無安全風險(不使用 eval())
  • 可精確控制轉換邏輯,如針對特定鍵名處理
  • 支援 mb_convert_encoding(),編碼支援更完善
  • 效能穩定,大陣列處理更可靠

總結與建議

兩種方法各有千秋:

  • var_export + eval:代碼極簡,適合快速原型或一次性腳本,但生產環境需謹慎使用 eval()
  • 遞歸遍歷:穩健、安全、可控,推薦用於生產環境核心業務代碼

實際項目中建議優先採用遞歸方案,並配合 mb_convert_encoding() 獲得最佳兼容性。若項目編碼統一為 UTF-8,盡量在數據入口處(資料庫連接、API 請求、文件讀取)統一處理編碼,從源頭避免編碼混亂。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved