PHP:UTF-8 跟Big5 的糾結 - 記下來

文章推薦指數: 80 %
投票人數:10人

今天在公司處理到一個編碼的問題,由於有許多歷史包袱都是以big5 下去開發,短時間內沒有辦法把所有系統轉換成utf-8 的情況下,就經常要面對編碼轉換 ... 網頁後端 PHP:UTF-8跟Big5的糾結 由 黃小蛙 · 已發表2018-09-17 ·已更新2019-12-04 今天在公司處理到一個編碼的問題,由於有許多歷史包袱都是以big5下去開發,短時間內沒有辦法把所有系統轉換成utf-8的情況下,就經常要面對編碼轉換的問題,這邊記錄一下今天遇到問題的解法。

有個新的系統B必須要串接舊系統A,B是utf-8環境,A是big5環境,目前設計是B透過AJAX來讀取A的資料,A這邊吃的是經過encodeURIComponent處理過的資料,例如:「你好」-> 「%A7%41%A6%6E」,前情提要到這邊。

小蛙的笨腦袋就開始想怎麼處理: 該頁面拿到的資料都是UTF-8,拿到之後用iconv轉big5先轉成big5之後,再做encodeURIComponent就好了easy~ 整個串起來之後,正確的「你好」應該是「%A7%41%A6%6E」,小蛙卻得到「%EF%BF%BDA%EF%BF%BDn」,看起來好像差很大,於是想說可能是因為php要透過javascriptencodeURIComponent來轉,雖然轉好big5但是又在utf-8的文本中印出導致的,於是開始往「一切都在php中轉好,javascript直接拿到轉好值就丟出去」的方向進行,小蛙改變策略: 在php中使用iconv把UTF-8轉成big5在php中使用rawurlencode轉換把結果透過javascript去要資料 嗯,看起來應該是無懈可擊!哦哦哦哦哦哦~高興的尖叫起來,隔壁同事都看了小蛙一眼,但回傳的結果怪怪的啊,看一下後台log,「你好」變成了「%A7A%A6n」,額外測試一個「外部」卻變成了「%A5~%B3%A1」,花惹發?嗯~港節好像比第一次得到的更接近正解一點(?),再來想想問題在哪,重新順一下流程好了,第一步跟第二步都做轉換的動作,其中一定有一個轉換失效了,要不第一個要不第二個(廢話)。

Google了一下看到這篇「php转码函数你还在用iconv吗?」,既然懷疑轉換出問題,那就把他換掉看看,事情絕對沒有憨人所想的那麼簡單,結果沒變!沒變…記得以前有一次使用base64來做過這件事,正當打算要來試的時候,超猛同事走了過來問說發生什麼事,小蛙大概跟他講解了一下,他只回了一句,那你把iconv轉的東西印出來看就知道了。

看來出現新的曙光,Google查到這篇「PHPconvertstringtohexandhextostring」,於是把iconv改成 mb_convert_encoding,然後再透過該文章中的function來做轉換,就可以成功轉換成系統A需要的格式了! 可喜可樂!留個備份,記錄超強同事的神蹟! 目錄1發現問題(2018-10-16更新)2使用rawurlencode(2018-10-16更新) 發現問題(2018-10-16更新) 上面的作法用了一段時間後發現有些字串會解析成不一樣的東西,例如:帶卜辭實際上收到卻變成帶尸辭、恆春變成恆柢、小屯變成匕屯。

以「帶卜辭」來當作轉換的例子帶=>「%B1a」卜=>「%A4R」辭=>「%C3%E3」 如果用上面的方法轉出來,轉出來會是全小寫,帶<=「%b1a」尸<=「%a4r」辭<=「%c3%e3」 下方是把它改成全大寫婢<=「%B1A」卜<=「%A4R」辭<=「%C3%E3」 但以上兩者都不對,因為原本的方法轉出來之後,就通通變成小寫,而大小寫卻對應到不一樣的字,造成這次的問題。

使用rawurlencode(2018-10-16更新) 只要先把要轉換的文字,正確地轉到big5之後,透過rawurlencode來做編碼就可以編出正確的內容囉! //先把要的文字轉成big5,再整個透過rawurlencode轉換 $txt=rawurlencode(mb_convert_encoding($txt,"big5","utf-8")); 您可能也想知道:LoadMore 標籤:phpbig5utf-8iconv亂碼rawurlencodeencodeURIComponent 下一則Ubuntu使用ssmtp透過Gmail發送email 上一則Cloudflare–超強大的免費CDN(?) 發佈留言取消回覆發佈留言必須填寫的電子郵件地址不會公開。

必填欄位標示為*留言*顯示名稱 電子郵件地址 個人網站網址 Δ 這個網站採用Akismet服務減少垃圾留言。

進一步了解Akismet如何處理網站訪客的留言資料。

跟隨: 更多 近期文章 向TWCA申請SSL憑證(Ubuntu,Apache) Windows複製所有檔案名稱,以及Notepad++多欄選取及複製功能 PanasonicFV-30BU2W遙控器按鍵維修 Netflix停學通知–談談釣魚郵件 HDMIAV轉接頭開箱 新光證券富貴角10號智慧單 CSS段落文字縮排、凸排(text-indent) 如何複製PDF內的部份文字 Word,Excel,PowerPoint另存成PDF Google雲端硬碟版本管理-固定共用連結 盤點那些曾經陪伴過小蛙的VPS虛擬主機



請為這篇文章評分?