VC下CHttpFile.ReadString 中文读取乱码的编码方法
时间: 2024-02-27 22:57:24 浏览: 196
在 VC 下使用 CHttpFile 读取中文时可能会出现乱码,这是因为 CHttpFile 默认使用 ISO-8859-1 编码,而中文需要使用其他编码方式。
解决方法是在读取之前设置 CHttpFile 的编码方式,例如使用 UTF-8 编码:
```
CHttpFile* pHttpFile = pHttpConnection->OpenRequest(CHttpConnection::HTTP_VERB_GET, strFile);
pHttpFile->SendRequest();
pHttpFile->QueryInfoStatusCode(dwRet);
pHttpFile->AddRequestHeaders("Accept-Language: zh-cn\r\n");
pHttpFile->AddRequestHeaders("Content-Type: text/html; charset=utf-8\r\n");
CString str;
pHttpFile->ReadString(str);
```
注意这里要设置 Content-Type 为 text/html; charset=utf-8,同时确保服务器返回的数据也是使用 UTF-8 编码的。
相关问题
VC6.0使用HttpSoap 向接口地址“ http://http://172.19.144.240//ResistanceWebService/ResistanceWebService.asmx 调用”MachineTrimDataUpload“方法
VC6.0使用HttpSoap向接口地址调用方法的步骤如下:
1. 在VC6.0中创建一个MFC应用程序项目;
2. 在项目中添加一个WebService引用:在“项目”菜单中选择“添加Web引用”,在弹出的对话框中输入接口地址“http://172.19.144.240//ResistanceWebService/ResistanceWebService.asmx”并点击“Go”按钮,等待一段时间后,系统会自动获取到该WebService的方法列表,此时点击“添加引用”按钮即可;
3. 在项目中添加一个SOAP连接:在“项目”菜单中选择“添加组件”,在弹出的对话框中选择“Microsoft Soap Type Library v3.0”,然后点击“确定”按钮;
4. 在代码中编写调用WebService方法的代码:首先需要定义一个CInternetSession对象和一个CHttpConnection对象,然后通过CHttpConnection对象打开指定的URL,然后创建一个CHttpFile对象,通过CInternetSession对象将请求发送给服务器,并接收响应,最后通过CInternetSession对象关闭连接,代码如下所示:
```
#include <afxinet.h>
CString strServer = _T("172.19.144.240");
CString strObject = _T("/ResistanceWebService/ResistanceWebService.asmx");
CInternetSession session;
CHttpConnection* pConnection = session.GetHttpConnection(strServer);
CHttpFile* pFile = pConnection->OpenRequest(CHttpConnection::HTTP_VERB_POST, strObject);
CString strHeaders = _T("Content-Type: text/xml; charset=utf-8");
pFile->SendRequest(strHeaders, NULL, 0, NULL, 0);
CString strRequest = _T("<?xml version=\"1.0\" encoding=\"utf-8\"?>\n");
strRequest += _T("<soap:Envelope xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\" xmlns:xsd=\"http://www.w3.org/2001/XMLSchema\" xmlns:soap=\"http://schemas.xmlsoap.org/soap/envelope/\">\n");
strRequest += _T("<soap:Body>\n");
strRequest += _T("<MachineTrimDataUpload xmlns=\"http://tempuri.org/\">\n");
strRequest += _T("<param1>value1</param1>\n");
strRequest += _T("<param2>value2</param2>\n");
strRequest += _T("</MachineTrimDataUpload>\n");
strRequest += _T("</soap:Body>\n");
strRequest += _T("</soap:Envelope>\n");
pFile->WriteString(strRequest);
pFile->EndRequest();
CString strResponse;
DWORD dwRead;
while (pFile->Read(&strResponse, 4096) > 0)
{
// do something with response
}
pFile->Close();
delete pFile;
pConnection->Close();
delete pConnection;
session.Close();
```
其中,需要将“MachineTrimDataUpload”替换为实际的WebService方法名,并将“param1”和“param2”替换为实际的方法参数名和值。
CHttpFile OpenRequest 使用例子
以下是CHttpFile OpenRequest使用的例子:
```cpp
#include <afxinet.h>
void Example()
{
CInternetSession session;
CHttpConnection* pConnection = NULL;
CHttpFile* pFile = NULL;
try
{
// 建立连接
pConnection = session.GetHttpConnection(_T("www.example.com"), INTERNET_DEFAULT_HTTP_PORT);
// 打开请求
pFile = pConnection->OpenRequest(CHttpConnection::HTTP_VERB_GET, _T("/index.html"));
// 发送请求
pFile->SendRequest();
// 读取响应
CString strResponse;
TCHAR szBuff[1024];
UINT nRead = 0;
while ((nRead = pFile->Read(szBuff, 1023)) > 0)
{
szBuff[nRead] = _T('\0');
strResponse += szBuff;
}
// 输出响应
_tprintf(_T("%s"), strResponse);
// 关闭文件
pFile->Close();
delete pFile;
pFile = NULL;
// 关闭连接
pConnection->Close();
delete pConnection;
pConnection = NULL;
}
catch (CInternetException* pEx)
{
// 处理异常
TCHAR szErr[1024];
pEx->GetErrorMessage(szErr, 1023);
_tprintf(_T("%s"), szErr);
pEx->Delete();
}
}
```
阅读全文