Форум русскоязычного сообщества Ubuntu


Увидели сообщение с непонятной ссылкой, спам, непристойность или оскорбление?
Воспользуйтесь ссылкой «Сообщить модератору» рядом с сообщением!

Автор Тема: std::string преобразование русских символов из UTF-8 в windows-1251[решено]  (Прочитано 5607 раз)

0 Пользователей и 1 Гость просматривают эту тему.

Оффлайн m_keeper

  • Автор темы
  • Любитель
  • *
  • Сообщений: 57
    • Просмотр профиля
Есть строка std::string с кодировкой UTF-8 и русскими символами.
Как её правильно преобразовать в windows-1251 на с++?

« Последнее редактирование: 08 Ноября 2010, 22:38:20 от m_keeper »

Оффлайн arrecck

  • Старожил
  • *
  • Сообщений: 1725
    • Просмотр профиля
(Нажмите, чтобы показать/скрыть)

Оффлайн m_keeper

  • Автор темы
  • Любитель
  • *
  • Сообщений: 57
    • Просмотр профиля
глюк есть непонятный
вот прогу пишу https://forum.ubuntu.ru/index.php?topic=121083

авторизация происходит на сервере login.vk.com
всё остальное на api.vkontakte.ru

C api.vkontakte.ru нет никаких проблем - и utf8 и русские символы понимает
а вот login.vk.com русские буквы в utf8 отказывается воспринимать,
к тому же отвечает в windows-1251, хотя я запрашиваю в utf8
вот и хочу послать ему то, что роднее.

Оффлайн Mam(O)n

  • Старожил
  • *
  • Сообщений: 5855
    • Просмотр профиля
libiconv ?

Пользователь решил продолжить мысль 08 Ноября 2010, 22:26:46:
зы. man 3 iconv
« Последнее редактирование: 08 Ноября 2010, 22:26:46 от Mam(O)n »

Оффлайн m_keeper

  • Автор темы
  • Любитель
  • *
  • Сообщений: 57
    • Просмотр профиля
то что надо !

char* convert(const char* s, const char* from_cp, const char* to_cp)
{
iconv_t ic = iconv_open(to_cp, from_cp);

if (ic == (iconv_t)(-1)) {
fprintf(stderr, "iconv: cannot convert from %s to %s\n", from_cp, to_cp);
return "";
}

char* out_buf = (char*)calloc(strlen(s)+1, 1);
char* out = out_buf;
char* in = (char*)malloc(strlen(s)+1);
strcpy(in, s);

size_t in_ln = strlen(s);
size_t out_ln = in_ln;
size_t k = iconv(ic, &in, &in_ln, &out, &out_ln);
if(k == (size_t)-1)
fprintf(stderr, "iconv: %u of %d converted\n", k, strlen(s));

if(errno != 0)
fprintf(stderr, "iconv: %s\n", strerror(errno));

iconv_close(ic);

return out_buf;
}


char* s = convert(postutf8, "utf-8", "cp1251");

и всё заработало

спасибо

Вот только интересно, почему сервер российской соц сети, представляющийся PHP/5.2.6-1+lenny не понимает российскую локаль utf8



Оффлайн Mam(O)n

  • Старожил
  • *
  • Сообщений: 5855
    • Просмотр профиля
Да тенденция такая. У быдлокодера единственная правильная кодировка та, которая стоит на его тачке и остальные значит надо удушить где только можно.

 

Страница сгенерирована за 0.018 секунд. Запросов: 21.