[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寫一份
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,學校網站已經可以正常吃到漢字囉!

留言

這個網誌中的熱門文章

[C#] Lambda花式應用噁爛寫法(跨UI委派秒幹、多線程處理...etc)

[Windows] 逆向工程 C++ 中入口函數參數 main(argc, argv) 與如何正確的進行參數劫持

重建天堂之門:從 32 位元地獄一路打回天堂聖地(上)深度逆向工程 WOW64 設計