这几天改写一个表单提交程序,用于控制一台基于网页管理的设备,原来是一个MBCS的支持MFC的控制台应用程序,可以正常使用。不过想到打包MFC后安装包太大了,而功能本来很简单,于是设法将其改为API程序;同时想到支持中英文界面,于是建立项目后将字符集设为了UNICODE。
    经过繁琐的代码修改后,调试了很长时间才得到返回的HTML (我发现原来在WINSOCKEXPERT中可以监视IE中的应答数据包,但监视该程序却总是失败,为什么?)。这时我却大吃一惊:所有的数据传送都是正常的,设备却不动作!由于无法看到数据包到底有何不同,就以为是API方式与MFC方式的差异,返回原来的程序改成静态链接MFC,在解决了一些符号冲突后,终于链接成功。但问题却依旧!两天之后偶然想到把字符集改回单字符集,设备控制就成功了。    显然,问题出在 MBCS 与 UNICODE 方式 WININET 提交的表单数据上面?

解决方案 »

  1.   

    ANSI、Unicode和宽字符之间的转换  方法一,使用MultiByteToWideChar将ANSI字符转换成Unicode字符,使用WideCharToMultiByte将Unicode字符转换成ANSI字符。  方法二,使用“_T”将ANSI转换成“一般”类型字符串,使用“L”将ANSI转换成Unicode,而在托管C++环境中还可使用S将ANSI字符串转换成String*对象。例如:TCHAR tstr[] = _T("this is a test");
    wchar_t wszStr[] = L"This is a test";
    String* str = S”This is a test”;   方法三,使用ATL 7.0的转换宏和类。ATL7.0在原有3.0基础上完善和增加了许多字符串转换宏以及提供相应的类,它具有如图3所示的统一形式:  其中,第一个C表示“类”,以便于ATL 3.0宏相区别,第二个C表示常量,2表示“to”,EX表示要开辟一定大小的缓冲。SourceType和DestinationType可以是A、T、W和OLE,其含义分别是ANSI、Unicode、“一般”类型和OLE字符串。例如,CA2CT就是将ANSI转换成一般类型的字符串常量。下面是一些示例代码:LPTSTR tstr= CA2TEX<16>("this is a test");
    LPCTSTR tcstr= CA2CT("this is a test");
    wchar_t wszStr[] = L"This is a test";
    char* chstr = CW2A(wszStr);  
      

  2.   

    谢谢,我知道字符集之间可以互相转换。不过由于URL提交是正常的,所以并不能判断出发送的数据包(主要是指表单数据)中到底有何差异?
      

  3.   

    我举个例子就更清楚了:   比如你想通过程序登陆论坛(假如它是ASP服务器):
               VC/MFC 网络编程问题
    URL为:http://expert.csdn.net/Expert/ForumList.asp?typenum=1&Roomid=5004你的程序用WININET发送请求后,服务器有响应,不过是进入到了
               http://expert.csdn.net/Expert/ForumList.asp
    的默认页面,即
           数字参数不允许为空!!()后面的表单数据没有效。这才是我的问题中涉及的关键。只不过我的表单要求用“POST”。