我想使用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保持打开状态。
您未正确对字符串数据进行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";`
谢谢,这是最终解决方案:
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());
}