使用 C++ 发布到服务器时,欧洲字符切换为奇怪的字符作为响应

European characters switch to strange characters in response when posting to server using C++

我正在努力从 Windows 下以正确格式从服务器获取响应。我尝试了两个 C++ 库 Beast,(基于 Boost Asio)和 Cpr(基于 libcurl),我遇到了完全相同的问题。

奇怪的是,我也在 C# (HttpClient) 中尝试过,一切正常。此外,在 Postman 和其他 REST 工具中它看起来不错。

当我 post 到服务器并且应该取回名称 René 时,我得到的是 Ren�。其他欧洲字符,如 æ、ø、å、ö 给出了同样奇怪的输出。对我来说,这看起来像是 utf-8 / iso-8859-1 的问题,但我无法弄清楚。服务器(基于 node.js)和响应设置为推出 utf-8。我们试图只重定向响应,这样它就不会访问数据库或类似的东西。所以,问题似乎在 C++ 下。对我可以尝试的任何建议都将不胜感激。

示例代码:

nlohmann::json test_json = nlohmann::json
{
    { "text", "Hi, my name is René" },
    { "language", "en" }
};

auto r = cpr::Post(cpr::Url{ "http://www.exampleserver.com" },
    cpr::Body{ test_json.dump() },
    cpr::Header{ { "content-type", "application/json; charset=utf-8" } });

std::cout << r.text << std::endl;

您的问题与编码字符串有关。该字符串很可能以 UTF-8 编码返回,但您没有正确转换它。

有各种库可以帮助您进行转换。这完全取决于您使用的 C++ 版本。如果没有更多详细信息,很难告诉您使用什么。

您似乎正在发送一些 ISO-8859-1 内容,但它被标记为 UTF-8。这会导致一连串的转换错误,这些错误会使 non-ASCII 个字符变得面目全非。

解决此问题的方法是识别 non-UTF-8 数据并正确转换它,或者使用正确的 MIME 类型和编码识别负载。