在 PHP 開發中,處理多種字符編碼共存的場景時常遇到,特別是早期項目遷移或對接第三方接口時,陣列編碼轉換是繞不開的話題。本文將介紹兩種實用的陣列編碼轉換方法,幫助開發者輕鬆解決 GBK 與 UTF-8 互轉難題。
這種方法的核心思路是將陣列序列化為 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;
}
var_export($arr, true) 將陣列導出為合法的 PHP 代碼字符串(如 array (0 => '中文',))iconv() 對該字符串進行編碼轉換eval() 執行字符串代碼並返回陣列結構return 語句則返回 NULLfalse// 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;
}
}
mb_convert_encoding(),編碼支援更完善兩種方法各有千秋:
實際項目中建議優先採用遞歸方案,並配合 mb_convert_encoding() 獲得最佳兼容性。若項目編碼統一為 UTF-8,盡量在數據入口處(資料庫連接、API 請求、文件讀取)統一處理編碼,從源頭避免編碼混亂。