解決GB2312、GBK、UTF-8轉換問題
GB2312:資訊交換用漢字編碼字符集(不支援生僻字的字符集,這是其本身限制的問題)。
GBK:漢字編碼字符集,向下與GB2312相容(支援生僻字的字符集)。
UTF-8:是一種針對Unicode的可變長度字元編碼,又稱萬國碼。
現在手上一個專案正在上傳基礎資料,客戶反饋某資料上傳失敗,我研究之後發現是客戶上傳的資料中“蘴”字導致的。可能之前code時沒有注意生僻字轉換的問題。
首先貼上出錯的上傳資料“某某縣某某田園蘴農業科技有限公司”,百度了一下,“蘴”讀音為“feng”,讀一聲。
問題程式碼:
$data[$i] = iconv('gb2312', 'utf-8', $temp); //iconv(原編碼, 目標編碼, 要轉的字串)
這行程式碼本身沒有錯誤,轉換非生僻字也不會出錯,但因生僻字“蘴”字的原因轉換失敗,轉換為“false”。
然後網上找類似問題,但發現根據如下網上的答案並沒有從根本上解決這個問題:
$data[$i] = iconv('gb2312', 'utf-8//IGNORE', $temp);
加上“//IGNORE”會讓iconv()函式忽略錯誤,繼續執行。
但轉換為“某某縣某某田園t農業科技有限公司”,此方法只是“壓制”錯誤,將“蘴”錯誤的轉換為“t”。
此函式不行,那就換一個函式:
$data[$i] = mb_convert_encoding($temp, 'utf-8', 'gb2312'); //mb_convert_encoding(要轉的字串, 目標編碼, 原編碼)
轉換為“連平縣鴻益田園?農業科技有限公司”,此方法與上面函式相同,只是“壓制”錯誤,將“蘴”錯誤的轉換為“?”
此時,我才意識到,不是函式的問題,是編碼的問題:GB2312是不支援生僻字的。
果然,將編碼換了一下這個問題就解決了:
$data[$i] = mb_convert_encoding($temp, 'utf-8', 'gbk');