【发布时间】:2020-01-02 16:35:18
【问题描述】:
我想使用 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 保持开放。
【问题讨论】:
-
查看
HttpSendRequestA的文档,A代表 ANSI。有一个 Unicode 版本的 API,其中函数以W结尾,例如支持 UTF-16 字符串的HttpSendRequestW。 -
@Romen 适用于
lpszHeaders参数,但不适用于lpOptional参数,它采用任意数据并按原样发送,因为它可能是二进制的。HttpSendRequestA很乐意在 POST 正文中发送 UTF-8 数据。我怀疑真正的问题可能是std::string在运行时实际上没有像OP 所期望的那样在运行时进行UTF-8 编码。确保编译器设置为以 UTF-8 格式保存源代码文件和字符串文字数据。此外,显示的字符串数据未正确进行 url 编码。HttpSendRequestA不会为你做 url-encoding,你必须自己做 -
@RemyLebeau,好点,他们可以使用
std::string myString = u8"abcdé";syntax for string literals 来强制使用UTF-8 编码,对吗?只要代码本身保存为 UTF-8 编码... -
我已经尝试过
HttpSendRequestW并且问题是一样的。此外,即使我使用std::string myString = u8"abcdé";声明字符串,char 也没有正确编码。 -
@ErwanZAMBA "char 编码不正确" - 那么你的项目有更大的问题需要追踪
标签: c++ string post utf-8 wininet