POST请求已被wstring类型截断并使用字符串格式正确

问题描述 投票:0回答:2

我想使用Wininet和之类的UTF-8特殊字符发出POST请求。

void sendArticle()
{
    LPCWSTR browser = L"MyClientApp/1.0";
    LPCWSTR domain = L"127.0.0.1";
    LPCWSTR methode = L"POST";
    LPCWSTR page = L"/shopping/article.php";
    std::wstring strContentType = L"Content-Type: application/x-www-form-urlencoded; charset=utf-8";
    LPCWSTR contentType = strContentType.c_str();
    std::wstring dataStr = L"article=thecontent";
    LPVOID data = (LPVOID)dataStr.c_str();

    HINTERNET hInternet = InternetOpenW(browser, INTERNET_OPEN_TYPE_PRECONFIG, NULL, NULL, 0);
    HINTERNET hConnection = InternetConnectW(hInternet, domain, 80, NULL, NULL, INTERNET_SERVICE_HTTP, 0, 1);
    HINTERNET hRequest  = HttpOpenRequestW(hConnection, methode, page, NULL, NULL, NULL, 0, 1);
    HttpSendRequestW(hRequest, contentType, strContentType.size(), data, dataStr.size());
}

如果我将字符串类型用于变量dataStr,则内容将正确发送。如果我对变量使用wstring类型(发送UTF-8内容),则请求将被截断。我可以使用Wireshark观察TCP数据包。要恢复,此行std::string dataStr = "article=thecontent";有效,但此行std::wstring dataStr = L"article=thecontent";不起作用。我检查了size()方法返回的int,它是正确的。这是什么奇怪现象,如何解决?

c++ string post wininet wstring
2个回答
0
投票

HttpSendRequestW的数据大小参数采用字节大小,但是您使用的是宽字符串,因此您确实想要:

HttpSendRequestW(hRequest, contentType, strContentType.size(), data, sizeof(WCHAR)*dataStr.size());

但是,http确实可以使用utf8正常工作,因此发送utf16有点奇怪(尽管您可以解释数据有效载荷,但是我想发送utf16可以,我想是)。

[您真正想做的就是无论如何都发送utf8-您可以使用狭窄的字符串-仅将dataStr设置为std :: string并用utf8代码点填充它就可以了。


0
投票

服务器需要UTF8数据(dataStr),因此必须将数据从UTF16转换为UTF8。将其他所有内容都保留为宽字符格式,因为这些函数可以由宽字符串API正确处理]

//convert dataStr to UTF8
int sz = WideCharToMultiByte(CP_UTF8, 0, dataStr.c_str(), -1, 0, 0, 0, 0);
std::string utf8(sz, 0);
WideCharToMultiByte(CP_UTF8, 0, dataStr.c_str(), (int)dataStr.size(), &utf8[0], sz, 0, 0);

//send UTF8 data
HttpSendRequestW(hRequest, contentType, strContentType.size(), utf8.data(), utf8.size());
© www.soinside.com 2019 - 2024. All rights reserved.