卷曲替换\ u以响应c ++中的\\ u

问题描述

我正在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没有逃脱任何操作。将URL加载到您选择的Web浏览器中,然后查看实际发送的原始数据。例如,这是我在Firefox中看到的内容:

raw data

服务器实际上正在发送Mu\u1e25arram,而不是您期望的Muḥarram。这完全没问题,因为服务器正在发送回JSON数据,并且允许JSON转义这样的Unicode字符。阅读JSON spec,特别是第9节,了解如何使用十六进制转义序列(在JSON中是可选的,但仍然允许)编码Unicode代码点。 \u1e25只是的JSON十六进制转义形式。

您仅按服务器发送的原样打印JSON内容 。您实际上根本没有解析它。如果您要使用实际的JSON解析器,则Mu\u1e25arram将为您解码为Muḥarram。例如,以下是Firefox解析JSON的方式:

parsed data

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

,

我要感谢Remy指出我实际上认为我需要将控制台转换为UTF-8模式时,我认为curl或JSON解析器是问题所在。 修复代码页之后,我才能够获得所需的输出。 为了将来参考,我添加了解决问题的代码:

我们需要包含 Windows.h

#include <Windows.h>

然后在我们的代码开头:

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

此后,我们需要使用以下命令将控制台重置回原始代码页:

SetConsoleOutputCP(oldcp);