調用 `iconv('gbk', 'utf8', $str)` 拋出 `Notice: iconv(): Unknown error (22)`,改為 `iconv('gbk', 'utf-8', $str)` 即正常。根因:**目標編碼名稱必須符合 IANA 標準別名**,`utf8` 非標準名,`utf-8` 才是。
<?php
$str = "嘿嘿";
iconv('gbk', 'utf8', $str); // ❌ PHP Notice: iconv(): Unknown error (22)
iconv('gbk', 'utf-8', $str); // ✅ 正常輸出
| 標準名 (推薦) | 常見錯誤寫法 | 備註 |
|---|---|---|
| UTF-8 / utf-8 | utf8, utf_8, utf8mb4 | 最常用,必須帶連字符 |
| GBK / gbk | gb2312 (子集), cp936 | GBK 擴展 GB2312,通常通用 |
| GB2312 / gb2312 | gb2312-80, euc-cn | 標準名 |
| BIG5 / big5 | big-5, cp950 | 繁體中文常用 |
| ISO-8859-1 | latin1, iso8859-1 | 西歐語系 |
| UTF-16LE / UTF-16BE | utf16, unicode | 需指定字節序 |
function safe_iconv($in_charset, $out_charset, $str) {
static $alias_map = [
'utf8' => 'utf-8', 'utf_8' => 'utf-8',
'gb2312' => 'gbk', // 視業務決定是否自動映射
];
$out_charset = $alias_map[strtolower($out_charset)] ?? $out_charset;
$in_charset = $alias_map[strtolower($in_charset)] ?? $in_charset;
return @iconv($in_charset, $out_charset.'//IGNORE//TRANSLIT', $str) ?: $str;
}
**`iconv` 編碼名稱區分大小寫且要求標準化**——`utf-8` ✅,`utf8` ❌。養成「複製 IANA 標準名」習慣,封裝統一入口,徹底杜絕 error 22。