DELPHI盒子
!实时搜索: 盒子论坛 | 注册用户 | 修改信息 | 退出
检举帖 | 全文检索 | 关闭广告 | 捐赠
技术论坛
 用户名
 密  码
自动登陆(30天有效)
忘了密码
≡技术区≡
DELPHI技术
lazarus/fpc/Free Pascal
移动应用开发
Web应用开发
数据库专区
报表专区
网络通讯
开源项目
论坛精华贴
≡发布区≡
发布代码
发布控件
文档资料
经典工具
≡事务区≡
网站意见
盒子之家
招聘应聘
信息交换
论坛信息
最新加入: tkzcol
今日帖子: 28
在线用户: 17
导航: 论坛 -> DELPHI技术 斑竹:liumazi,sephil  
作者:
男 xlonger (xlonger) ★☆☆☆☆ -
普通会员
2012/3/3 21:32:53
标题:
学习小得: TWinHTTP组件 关于 URL参数用UTF8编码时 存在的问题 浏览:1827
加入我的收藏
楼主: 如果 一个服务端 要求 URL 参数值用 UTF8编码,那么 将 参数值编码后,用
TWinHTTP组件发请求时,不会返回正确的信息。因为TWinHTTP组件内部代码,与UTF8编码存在冲突。

  with WinHTTP1 do
  begin
    url := 'http://www.2ccc.com/test/?name=%xx';%xx表格utf8编码的参数值
    Read()
  end;

运行到

procedure TCustomWinHTTP.ThreadExecute;
。。。
  运行到下面的行
  ParseURL(FURL, ProtocolName, HostName, ObjectName,
          URLUsername, URLPassword, URLExtraInfo, PortNumber);

这个函数对FURL 里的 utf8参数值无法分析,导致取得的URLExtraInfo值是乱码
function ParseURL(URL: String; var Protocol, HostName, URLPath,
  Username, Password, ExtraInfo: String; var Port: Word): Boolean;
var
  URLComp: TURLComponents;
begin
  if Pos('://', URL) = 0 then // this should be HTTP by default
    URL := HTTPPrefix + URL;

  InitMSRecord(URLComp, SizeOf(URLComp));
  with URLComp do
   begin
    dwSchemeLength     := INTERNET_MAX_SCHEME_LENGTH + 1;
    dwHostNameLength   := INTERNET_MAX_HOST_NAME_LENGTH + 1;
    dwUserNameLength   := INTERNET_MAX_USER_NAME_LENGTH + 1;
    dwPassWordLength   := INTERNET_MAX_PASSWORD_LENGTH + 1;
    dwUrlPathLength    := INTERNET_MAX_PATH_LENGTH + 1;
    dwExtraInfoLength  := INTERNET_MAX_PATH_LENGTH + 1;
    GetMem(lpszScheme,    INTERNET_MAX_SCHEME_LENGTH + 1);
    GetMem(lpszHostName,  INTERNET_MAX_HOST_NAME_LENGTH + 1);
    GetMem(lpszUserName,  INTERNET_MAX_USER_NAME_LENGTH + 1);
    GetMem(lpszPassword,  INTERNET_MAX_PASSWORD_LENGTH + 1);
    GetMem(lpszUrlPath,   INTERNET_MAX_PATH_LENGTH + 1);
    GetMem(lpszExtraInfo, INTERNET_MAX_PATH_LENGTH + 1);

    Result := InternetCrackUrl(PChar(URL), Length(URL), ICU_ESCAPE, URLComp);//关键是这个API函数 对utf8编码后的字符 没法正确分析


    if Result then
     begin
      Protocol  := lpszScheme;
      HostName  := lpszHostName;
      URLPath   := lpszUrlPath;
      Username  := lpszUserName;
      Password  := lpszPassword;
      ExtraInfo := lpszExtraInfo;//乱码
      Port      := nPort;
     end;

    FreeMem(lpszExtraInfo);
    FreeMem(lpszUrlPath);
    FreeMem(lpszPassword);
    FreeMem(lpszUserName);
    FreeMem(lpszHostName);
    FreeMem(lpszScheme);
   end;
end;
   
接下来,继续发请求时,就不会返回正确的内容了。    

----------------------------------------------
我打的是酱油,而不是别的什么油。
我灌的是口水,而不是别的什么水。
我聊的折腾不是那个不折腾的折腾。
我说的阿娇不是那个邓玉娇的阿娇。
3个代表,6个为什么,9个肠胃炎。
D性强的领导干部都不喜欢热比娅。
我特别要讲的是,屁民网黄色论坛是我经常上网必选的 网站之一
作者:
男 xlonger (xlonger) ★☆☆☆☆ -
普通会员
2012/3/4 9:26:24
1楼: 我说的是这个组件

  WinHTTP v3.1

  Copyright (c) 1999-2005 UtilMind Solutions
  All rights reserved.
  E-Mail: info@utilmind.com
  WWW: http://www.utilmind.com, http://www.appcontrols.com

  The entire contents of this file is protected by International Copyright
Laws. Unauthorized reproduction, reverse-engineering, and distribution of all
or any portion of the code contained in this file is strictly prohibited and
may result in severe civil and criminal penalties and will be prosecuted to
the maximum extent possible under the law.
----------------------------------------------
我打的是酱油,而不是别的什么油。
我灌的是口水,而不是别的什么水。
我聊的折腾不是那个不折腾的折腾。
我说的阿娇不是那个邓玉娇的阿娇。
3个代表,6个为什么,9个肠胃炎。
D性强的领导干部都不喜欢热比娅。
我特别要讲的是,屁民网黄色论坛是我经常上网必选的 网站之一
信息
登陆以后才能回复
Copyright © 2CCC.Com 盒子论坛 v3.0.1 版权所有 页面执行1695.313毫秒 RSS