PHP:UTF-8 跟Big5 的糾結 - 記下來
文章推薦指數: 80 %
今天在公司處理到一個編碼的問題,由於有許多歷史包袱都是以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虛擬主機
延伸文章資訊
- 1編碼Big5轉為UTF8 - 政府資料開放平臺
編碼Big5轉為UTF8 · 一、先將檔案已記事本開啟. 將ods檔案以記事本開啟檔案 · 二、開啟後,點選檔案-另存新檔. 用記事本另存新檔 · 三、於儲存按鈕的左方,選擇UTF-8編碼,再 ...
- 2請問big5, unicode and unicode UTF-8 的差異@ 程式設計
較舊的軟體會採用這個編碼你打開非BIG5的軟體,像是簡體中文的軟體,會亂碼表示那個軟體就是採用ANSI編碼 ... 201002091239請問big5, unicode and unicode...
- 3字符集:Big5與Unicode的差異 - iFontCloud 文鼎雲字庫
字符集:Big5與Unicode的差異. 2021-07-20 09:51:32.0. 分類: Font Technology Big5 Unicode 3.0 缺字 字符集. 我們在輸入文字的...
- 4五倍券官網當機亂碼為什麼「滚」出來? - 黑暗執行緒
一樣是UTF8 誤判成BIG5,IE、Edge/Chrome(都是Chromium 核心)、Firefox 出現的亂碼不盡相同,也跟.NET 轉換結果不同。IE 顯示為「甇斗? ? 瘜蝙?」(比.
- 5Re: [問題] 請教Big5 和UTF-8 的編碼差異... - 精華區Web_Design
採用變動大小,中文字使用3 bytes,英文則維持1 byte 因此若轉碼後,資料庫整體會變成1.5 倍大,200MB(Big5) -> 300MB(UTF-8) 2.