Curl 替换 \u 以响应 C++ 中的 \\u

Curl replacing \u in response to \\u in c++

我在 windows 中使用 libcurl 发送请求,我收到的响应中有一些以 \u 开头的通用字符。 Libcurl 不识别这个通用字符,因此它逃避了 \,将通用字符变为 \u。 有没有什么办法解决这一问题?我试过使用 str.replace 但它不能替换转义序列 我用来实现这个的代码是

#include <iostream>
#include <string>
#include <cpr/cpr.h>

int main()
{
    auto r = cpr::Get(cpr::Url{"http://prayer.osamaanees.repl.co/api"});
    std::string data = r.text;
    std::cout << data << std::endl;
    return 0;
}

此代码使用 cpr 库,它是 curl 的包装器。 它打印出以下内容:

{
"times":{"Fajr":"04:58 AM","Sunrise":"06:16 AM","Dhuhr":"12:30 PM","Asr":"04:58 PM","Maghrib":"06:43 PM","Isha":"08:00 PM"},
"date":"Tuesday, 20 Mu\u1e25arram 1442AH"
}

注意单词 Mu\u1e25arram,它应该是 Muḥarram 但由于 curl 在 u 之前转义了 \ 它打印出 \u1e25

你的分析是错误的。 Libcurl 没有转义任何东西。在您选择的 Web 浏览器中加载 URL 并查看实际发送的 原始数据 。例如,这是我在 Firefox 中看到的:

服务器确实在发送 Mu\u1e25arram,而不是您期望的 Muḥarram。这 非常好,因为服务器正在发回 JSON 数据,并且 JSON 可以像这样转义 Unicode 字符。阅读 JSON spec,特别是关于如何使用十六进制转义序列对 Unicode 代码点进行编码的第 9 节(这在 JSON 中是可选的,但仍然允许)。 \u1e25 只是 JSON hex-escaped 形式 .

您只是打印出 JSON 内容 as-is,与服务器发送的完全一样。你实际上根本没有解析它。如果您要使用实际的 JSON 解析器,Mu\u1e25arram 将为您解码为 Muḥarram。例如,这里是 Firefox 如何解析 JSON:

解码 JSON 数据不是 libcurl 的工作。它的工作仅仅是为您提供服务器发送的数据。之后根据需要解释数据是您的工作。

我要感谢 Remy 指出我在考虑 curl 或 JSON 解析器时有多么错误,而实际上我需要将控制台转换为 UTF-8 模式。 在我修复 Codepage 之后,我能够获得我想要的输出。 为了将来参考,我添加了解决问题的代码:

我们需要包括 Windows.h

#include <Windows.h>

然后在我们代码的开头:

UINT oldcp = GetConsoleOutputCP();
SetConsoleOutputCP(CP_UTF8);

在此之后,我们需要将控制台重置回原始代码页:

SetConsoleOutputCP(oldcp);