问题描述
我正在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中看到的内容:
服务器实际上正在发送Mu\u1e25arram
,而不是您期望的Muḥarram
。这完全没问题,因为服务器正在发送回JSON数据,并且允许JSON转义这样的Unicode字符。阅读JSON spec,特别是第9节,了解如何使用十六进制转义序列(在JSON中是可选的,但仍然允许)编码Unicode代码点。 \u1e25
只是ḥ
的JSON十六进制转义形式。
您仅按服务器发送的原样打印JSON内容 。您实际上根本没有解析它。如果您要使用实际的JSON解析器,则Mu\u1e25arram
将为您解码为Muḥarram
。例如,以下是Firefox解析JSON的方式:
解码JSON数据不是libcurl的工作。它的工作仅仅是为您提供服务器发送的数据。以后根据需要解释数据是您的工作。
,我要感谢Remy指出我实际上认为我需要将控制台转换为UTF-8模式时,我认为curl或JSON解析器是问题所在。 修复代码页之后,我才能够获得所需的输出。 为了将来参考,我添加了解决问题的代码:
我们需要包含 Windows.h
#include <Windows.h>
然后在我们的代码开头:
UINT oldcp = GetConsoleOutputCP();
SetConsoleOutputCP(CP_UTF8);
此后,我们需要使用以下命令将控制台重置回原始代码页:
SetConsoleOutputCP(oldcp);