用Wininet发送带有UTF-8特殊字符的POST消息

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

我想使用Wininet在PHP页面上发送消息。我的代码实际上与UTF-8特殊字符(如€,é,à)不兼容。如何转换呢?我搜索了很长时间,但找不到解决方案。我尝试使用wstring,但是它是同样的问题。这是源代码:

void sendHello()
{
    LPCSTR header = "Content-Type: application/x-www-form-urlencoded; charset=utf-8";
    std::string dataStr = "message=ééàà€€";
    LPVOID myMessage = (LPVOID)dataStr.c_str();
    HINTERNET hInternet = InternetOpenA("InetURL/1.0", INTERNET_OPEN_TYPE_PRECONFIG, NULL, NULL, 0);
    HINTERNET hConnection = InternetConnectA(hInternet, "127.0.0.1", 80, " ", " ", INTERNET_SERVICE_HTTP, 0, 1);
    HINTERNET hRequest = HttpOpenRequestA(hConnection, "POST", "/SendMessage.php", NULL, NULL, NULL, 0, 1);
    HttpSendRequestA(hRequest, header, strlen(header), myMessage, dataStr.size());
}

我发布了一个新问题,因为某人已经发布了类似的问题,但该问题仍未解决,并且解决方案无效。 (这是一个StackOverflow建议,以打开一个新问题)。感谢@ Barmak,@ Shemirani,@ Unheilig,@ Daniel Widdis保持打开状态。

c++ string post utf-8 wininet
2个回答
0
投票

您未正确对字符串数据进行url编码。需要将非ASCII和保留字符进行字符集编码为字节,然后将所得的字节编码为%HH格式。

ééàà€€的UTF-8编码形式是字节

[C3 A9 C3 A9 C3 A0 C3 A0 E2 82 AC E2 82 AC

因此更改此

std::string dataStr = "message=ééàà€€"; 

为此

std::string dataStr = "message=%C3%A9%C3%A9%C3%A0%C3%A0%E2%82%AC%E2%82%AC";`

0
投票

谢谢,这是最终解决方案:

void sendHello()
{
    LPCSTR header = "Content-Type: application/x-www-form-urlencoded; charset=utf-8";
    std::string dataStr = u8"message=ééàà€€";
    LPVOID myMessage = (LPVOID)dataStr.c_str();
    HINTERNET hInternet = InternetOpenA("InetURL/1.0", INTERNET_OPEN_TYPE_PRECONFIG, NULL, NULL, 0);
    HINTERNET hConnection = InternetConnectA(hInternet, "127.0.0.1", 80, " ", " ", INTERNET_SERVICE_HTTP, 0, 1);
    HINTERNET hRequest = HttpOpenRequestA(hConnection, "POST", "/SendMessage.php", NULL, NULL, NULL, 0, 1);
    HttpSendRequestA(hRequest, header, strlen(header), myMessage, dataStr.size());
}
© www.soinside.com 2019 - 2024. All rights reserved.