Почему символы становятся бесполезными?libcurl c ++ Utf-8 в кодировке html; - PullRequest
4 голосов
/ 27 ноября 2011

Прежде всего, извините за мой плохой английский. Я сделал свое исследование, но нет никаких связанных ответов, чтобы решить мою проблему. Я понял и узнал о CodePages Utf 8 и других вещах в c или c ++, а также знаю, что строки могут содержать utf8. Моя машина для разработки winxp english с кодовой страницей консоли установлена ​​на 1254 (windows turkish), и я могу использовать расширенные турецкие символы (İığşçüö) в 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 'Ä ±', 'ö' печатает 'Ķ', 'ğ' выводит 'ÄŸ', 'İ' печатает 'Ä˚' и т. Д.

если я изменю кодовую страницу на 65000,

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

Тогда результат такой же, так что причина проблемы - не cmd CodePage.

Ответные заголовки http указывают, что кодировка установлена ​​в utf-8, а метаданные html такие же.

Как я понял, источником проблемы является сама функция "писатель" или "завиток". Поступающие данные анализируются на символы, такие расширенные символы, как ı, İ, ğ, анализируются на 2 символа и записываются в массив символов std :: string таким образом, таким образом кодовая страница, эквивалентная этим половинным символам, распечатывается или используется где-либо в коде (например, mysqlpp для записи эта строка в БД).

Я не знаю, как решить это или что делать в функции писателя или где-либо еще. Я правильно думаю? Если так, что я могу сделать с этой проблемой? Или источник проблемы в другом месте?

Я использую mingw32 Windows Xp 32bit Code :: Blocks ide.

Ответы [ 2 ]

1 голос
/ 27 ноября 2011

Правильная кодовая страница для UTF-8: 65001 , а не 65000.

Кроме того, вы проверили, если установка кодовой страницы прошла успешно? Функция SetConsoleOutputCP указывает на успех или неудачу по возвращаемому значению.

0 голосов
/ 28 ноября 2011

Возвращаемая строка - utf-8, поэтому вы должны установить для кодовой страницы консоли значение 65001 (в соответствии с рекомендациями sth). Или преобразуйте строку в 1254 и используйте кодовую страницу 1254 для вывода на консоль, как вы делали раньше.

...