[C++Builder][Delphi]讓IdHTTP可以正常Post出Big5漢字的參數
因為寫比賽作品需要,要對學校系統做POST封包,
設定指定email文字內容,像底下這樣
不過到了學校系統一看發現...
中文字的部分通通被設置為了問號...Otz.
於是用封包工具攔截一下看出了什麼狀況
原來Indy控件組內的IdHTTP在做POST的時候對漢字解析上有問題...
會自動把漢字變成了問號(找不到對應字詞做發送)
所以能知道的事情是,我們在POST前先做URL Encode,
把原本的文字轉%XX%XX的形式那麼IdHTTP做發送就不會有無法解析中文字的問題.
翻了一下,學校的asp網站採用的編碼為Big5.
所以我們得設計一個URL Encode去把當前UncodeString轉Big5編碼再做URL Encode.
做法上因為我對URL Encode整個機制處理上沒那麼清楚,
所以問了一下C++Builder前輩蕭沖大大
Big5編碼URL Encode的Delphi Code寫法在這(原版)
我重新用C++Builder寫一份
針對可能有中文字的參數做了URL Encode
ok,發送出去之後,攔截一下封包可以看到很乖的用URL Encode之後的資料送出去
然後回學校網站看一下
Ok,學校網站已經可以正常吃到漢字囉!
設定指定email文字內容,像底下這樣
不過到了學校系統一看發現...
中文字的部分通通被設置為了問號...Otz.
於是用封包工具攔截一下看出了什麼狀況
原來Indy控件組內的IdHTTP在做POST的時候對漢字解析上有問題...
會自動把漢字變成了問號(找不到對應字詞做發送)
所以能知道的事情是,我們在POST前先做URL Encode,
把原本的文字轉%XX%XX的形式那麼IdHTTP做發送就不會有無法解析中文字的問題.
翻了一下,學校的asp網站採用的編碼為Big5.
所以我們得設計一個URL Encode去把當前UncodeString轉Big5編碼再做URL Encode.
做法上因為我對URL Encode整個機制處理上沒那麼清楚,
所以問了一下C++Builder前輩蕭沖大大
Big5編碼URL Encode的Delphi Code寫法在這(原版)
我重新用C++Builder寫一份
String nURLEncode(String S,bool InQueryString){ String Ret = ""; TByteDynArray bys = TEncoding::GetEncoding(950)->GetBytes(S); //採用Big5(950)設置轉換用途編碼 for (int i = 0; i < (bys.Length); i++) { if (((bys[i] >= 0x41)&&(bys[i] <= 0x5A))|| ((bys[i] >= 0x61)&&(bys[i] <= 0x7A))|| ((bys[i] >= 0x30)&&(bys[i] <= 0x39))|| (bys[i] == 0x2D)||(bys[i] == 0x5F)|| (bys[i] == 0x2E)) { Ret += char(bys[i]); }else if (bys[i] == 0x20) { Ret += (InQueryString?"+":"%20"); }else{ Ret += "%" + IntToHex(bys[i],2); } } return Ret; }
針對可能有中文字的參數做了URL Encode
ok,發送出去之後,攔截一下封包可以看到很乖的用URL Encode之後的資料送出去
然後回學校網站看一下
Ok,學校網站已經可以正常吃到漢字囉!
留言
張貼留言