2015年1月8日 星期四

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