1. 程式人生 > >解決GB2312、GBK、UTF-8轉換問題

解決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');