在 C++ 中使用 Wininet 发送 POST 请求时的编码问题

Posted

技术标签:

【中文标题】在 C++ 中使用 Wininet 发送 POST 请求时的编码问题【英文标题】:Problem of encoding when sending POST request using Wininet in C++ 【发布时间】:2019-12-31 11:27:47 【问题描述】:

我想使用 Wininet 在 POST 请求中发送 UTF-8 内容。 内容已正确发送,但是当它是像 这样的特殊字符时,不会正确写入和打印。

我对 Postman 也有同样的问题,所以我不太清楚是我的 php 代码来编写接收到的内容还是我的 C++ 代码。 这是将内容写入文本文件以测试接收功能的 PHP 代码:

<html>
    <head>
        <meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
    </head>
    <body>
        <?php
                $fh = fopen("amount_test.txt", 'w') or die("can't open file");
                fwrite($fh, utf8_encode($_POST["amount"]));
                fclose($fh);
        ?>
    </body>
</html>

这是发送带有 UTF-8 内容的 POST 请求的函数:

void sendAmount()

    LPCWSTR browser = L"Game/2.3";
    LPCWSTR domain = L"127.0.0.1";
    LPCWSTR methode = L"POST";
    LPCWSTR page = L"/minigame/engine/sendAmount.php";
    std::wstring strContentType = L"Content-Type: application/x-www-form-urlencoded; charset=utf-8";
    LPCWSTR contentType = strContentType.c_str();
    std::string dataStr = "amount=" + "42,342€";
    LPVOID dataToSend = (LPVOID)dataStr.c_str();

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

【问题讨论】:

【参考方案1】:

每个字符串都是wchar,除了:

std::string dataStr = "amount=" + "42,342€";

应该是:

std::wstring dataStr = L"amount=" + L"42,342€";

【讨论】:

以上是关于在 C++ 中使用 Wininet 发送 POST 请求时的编码问题的主要内容,如果未能解决你的问题,请参考以下文章

HttpOpenRequest () Wininet c++ e PHP

在 C++ 中使用 wininet

将文件发送到 HTTP 服务器(C++ Wininet)

将进度条添加到wininet http上传C++

C++ WinInet InternetCloseHandle 崩溃

WinInet C++ ftp 模板?