为什么字符变得无用?libcurl c++ Utf-8编码的html;



首先为我糟糕的英语道歉。我已经做了研究,但是没有任何相关的答案可以解决我的问题。我已经了解并学习了copage utf8和其他关于c或c++的东西,还要知道字符串可以保存utf8。我的开发机器winxp英语,控制台代码页设置为1254 (windows土耳其语),我可以在std::string中使用土耳其语扩展字符(İığşçüö),计数它们并将它们发送到mysqlpp api以编写dbs。没有问题。但是当我想使用curl获取一些html并将其写入std::string时,我的问题开始了。

#include <iostream>
#include <windows.h>
#include <wincon.h>
#include <curl.h>
#include <string>
int main()
{
   SetConsoleCP(1254);
   SetConsoleOutputCP(1254);
   std::string s;
   std::cin>>s;
   std::cout<<s<<std::endl;
   return 0;
}

当我运行这些并输入ğşçöüİı时,输出是相同的ğşçöüİı;

#include <iostream>
#include <windows.h>
#include <wincon.h>
#include <curl.h>
#include <string.h>
size_t writer(char *data, size_t size, size_t nmemb, std::string *buffer);
{
   int res;
   if(buffer!=NULL)
   {
      buffer->append(data,size*nmemb);
      res=size*nmemb;
   }
   return res;
}
int main()
{
   SetConsoleOutputCP(1254);
   std::string html;
   CURL *curl;
   CURLcode result;
   curl=curl_easy_init();
   if(curl)
   {
      curl_easy_setopt(curl, CURLOPT_URL, "http://site.com");
      curl_easy_setopt(curl, CURLOPT_WRITEFUNCTION, writer);
      curl_easy_setopt(curl, CURLOPT_WRITEDATA, &html);
      result=curl_easy_perform(curl);
      if(result==CURLE_OK)
      {
         std::cout<<html<<std::endl;
      }
   }
   return 0;
}

当我编译和运行时;

如果html包含"ı"打印出cmd的±’,"o '打印¶’,‘ğpirnts"ÿ"、"İ"打印出"˚"等。

如果我将CodePage更改为65000,

...
SetConsoleOutputCP(65000);//For utf8
...

那么结果是相同的,所以问题的原因不是cmd CodePage。

response http headers表示字符集设置为utf-8,与html元数据相同。

据我所知,问题的根源是函数"writer"或"curl"本身。传入的数据被解析为字符,因此扩展的字符如' ',İ, ' '被解析为2个字符,并写入字符数组std::string,这样代码页相当于这些半字符打印出来或在代码中的任何地方使用(例如mysqlpp将该字符串写入db)。

我不知道如何解决这个问题,或者在作家功能或其他任何地方做什么。我想的对吗?如果是这样,我该怎么办呢?还是问题的根源在别处?

我使用的是mingw32 Windows Xp 32bit Code::Blocks ide.

正确的UTF-8代码页是65001,而不是65000。

另外,您是否检查了设置代码页是否成功?

SetConsoleOutputCP函数通过返回值判断是否成功。

返回的字符串是utf-8,因此您应该将控制台代码页设置为65001(如sth所建议的)。或者将字符串转换为1254,并使用1254代码页作为控制台输出,就像前面所做的那样。

最新更新