Форум программистов, компьютерный форум CyberForum.ru

Как поменять кодировку? - C++

Восстановить пароль Регистрация
 
Рейтинг: Рейтинг темы: голосов - 19, средняя оценка - 4.68
Sadboy
1 / 1 / 0
Регистрация: 05.03.2014
Сообщений: 9
06.03.2014, 00:47     Как поменять кодировку? #1
Здравствуйте. У меня есть строка с непонятной кодировкой.
string str="╨Ф╨╛╨▒╤А╤Л╨╣ ╨▓╨╡╤З╨╡╤А"; //Добрый вечер
Пробовал использовать функцию MultiByteToWideChar(), но перекодировать строку не удалось. Как привести текст в нормальный вид? если это вообще возможно...
Лучшие ответы (1)
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Bend3r
 Аватар для Bend3r
142 / 129 / 17
Регистрация: 29.07.2012
Сообщений: 681
06.03.2014, 01:05     Как поменять кодировку? #2
Удалите этот текст и введите "Добрый вечер". Либо оно сразу автоматически вам меняет на крокозяблики?
Black Fregat
 Аватар для Black Fregat
1353 / 983 / 215
Регистрация: 31.05.2009
Сообщений: 4,093
06.03.2014, 01:18     Как поменять кодировку? #3
Строка Utf-8 прочитана как 866. Соответственно, для обратного преобразования нужно закодировать эти символы в 866, а полученный набор байт прочитать как Utf-8
Sadboy
1 / 1 / 0
Регистрация: 05.03.2014
Сообщений: 9
06.03.2014, 10:59  [ТС]     Как поменять кодировку? #4
Bend3r, Этот текст я беру из файла javascript, но кодировка текста не указана, из-за этого наверно используется CP866.
Black Fregat, Пробовал переводить:
wchar_t * wbuf;
int size;

string src = "╨Ф╨╛╨▒╤А╤Л╨╣ ╨▓╨╡╤З╨╡╤А";
size = MultiByteToWideChar(CP_UTF8, 0, src.c_str(), -1, NULL, 0);
wbuf = (wchar_t*)calloc(sizeof(wchar_t), size);
MultiByteToWideChar(CP_UTF8, 0, src.c_str(), -1, wbuf, size);

char * buf;
size = WideCharToMultiByte(866, 0, wbuf, -1, NULL, 0, NULL, NULL);
buf = (char*)calloc(sizeof(char), size);
WideCharToMultiByte(866, 0, wbuf, -1, buf, size, NULL, NULL);

cout << buf;
На выходе получаю строку из вопросов... Явно что-то делаю не так)
Evg
Эксперт С++Автор FAQ
 Аватар для Evg
16824 / 5245 / 320
Регистрация: 30.03.2009
Сообщений: 14,125
Записей в блоге: 26
06.03.2014, 17:59     Как поменять кодировку? #5
Поэкспериментируй. Сначала меняй различные кодировки на входе, а потом смотри, какие конкретно числа получились в массиве wchar'ов. Если ты видишь набор значений, похожих на русские буквы (коды см. тут http://unicode-table.com/ru/sections/cyrillic/), значит ты угадал со входной кодировкой

А дальше ставь нужную выходную. В виндузовой консоли вроде бы как это и есть 866, но точно не знаю
zer0mail
2185 / 1868 / 187
Регистрация: 03.07.2012
Сообщений: 6,640
Записей в блоге: 1
06.03.2014, 22:29     Как поменять кодировку? #6
Кодировки - это еще те грабли Надо ясно представлять задачу, а фраза "поменять" малоинформативна
Есть источник (например, входной файл), память, выходной файл, консоль... Где именно, что и на что нужно поменять?

Чтобы разобраться, нужно:
1. Читаемый файл.
2. Код, который читает строки
3. Код, который пишет в файл и/или выводит в консоль
Black Fregat
 Аватар для Black Fregat
1353 / 983 / 215
Регистрация: 31.05.2009
Сообщений: 4,093
07.03.2014, 15:53     Как поменять кодировку? #7
Вот поясните мне, не проще ли сразу при чтении этого файла задать кодировку utf-8?
Зачем Вы ситаете эти кракозябры как 866, а потом как-то перекодируете?

Если это одноразовая задача, поменяйте кодировку в любом текстовом редакторе.
Если это многоразовая задача, ловите источник возникновения ошибки.
Этот источник там, где utf-8 читается как 866.
Sadboy
1 / 1 / 0
Регистрация: 05.03.2014
Сообщений: 9
07.03.2014, 21:24  [ТС]     Как поменять кодировку? #8
Сейчас попытаюсь объяснить зачем хотел перекодировать эту строку. Я использовал WinInet API для получения с сервера файла в формате .json(в ответных заголовках указана кодировка UTF-8), но прочесть этот файл с помощью функции InternetReadFile() не смог. Добавил к url переменную, тем самым заставив сервер присылать мне файл в формате .js, но в ответных заголовках не указана кодировка. Видимо функция InternetReadFile() как-то анализирует заголовки и если не находит там кодировку, использует стандартную кодировку консоли. Думал, что смогу перекодировать полученную строку...
Black Fregat, Вы правы, можно создать поток и сохранять эту строку в текстовом документе, но моя программа работает в бесконечном цикле, не хотелось бы постоянно редактировать этот документ.
Наверно придется как-то работать с файлом json...
Avazart
 Аватар для Avazart
6900 / 5140 / 252
Регистрация: 10.12.2010
Сообщений: 22,580
Записей в блоге: 17
07.03.2014, 21:27     Как поменять кодировку? #9
Вводим сюда http://www.artlebedev.ru/tools/decoder/ -проверяем CP866 → UTF-8
zer0mail
2185 / 1868 / 187
Регистрация: 03.07.2012
Сообщений: 6,640
Записей в блоге: 1
07.03.2014, 21:54     Как поменять кодировку? #10
У меня этот код изначально не работает, т.к. в str сразу записаны вопросики.
Black Fregat
 Аватар для Black Fregat
1353 / 983 / 215
Регистрация: 31.05.2009
Сообщений: 4,093
07.03.2014, 22:34     Как поменять кодировку? #11
Сообщение было отмечено автором темы, экспертом или модератором как ответ
InternetReadFile должен выдавать строку байт.
К ней нужно сразу применить MultiByteToWideChar.
И должно наступить Вам счастье.

А кракозябры у Вас, вероятнее всего, получились из-за того,
что эти несчастные символы туда-сюда гоняли через дурную консоль Windows,
у которой кодировка не совпадает с системной,
специально, чтобы программистам жизнь мёдом не казалась..

Добавлено через 8 минут
Забыл уточнить, что MultiByteToWideChar (CP_UTF8, ...)
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
07.03.2014, 23:38     Как поменять кодировку?
Еще ссылки по теме:

C++ Работа с потоком изменить кодировку
C++ Как распознать кодировку текста при вводе из файла?
Как задать кодировку для заголовка окна? C++

Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
Sadboy
1 / 1 / 0
Регистрация: 05.03.2014
Сообщений: 9
07.03.2014, 23:38  [ТС]     Как поменять кодировку? #12
Все получилось, не знаю почему раньше не получалось, наверно в кодировках запутался.
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
        char  szData[2048];
        DWORD dwBytesRead;
        BOOL bRead =
            ::InternetReadFile(
            godRequest,
            szData, sizeof(szData)-1,
            &dwBytesRead);
 
 
 
        szData[dwBytesRead] = 0;
        wchar_t * wbuf;
        int size;
 
        size = MultiByteToWideChar(CP_UTF8, 0, szData, -1, NULL, 0);
        wbuf = (wchar_t*)calloc(sizeof(wchar_t), size);
        MultiByteToWideChar(CP_UTF8, 0, szData, -1, wbuf, size);
        wcout << wbuf << "\n";
        char * buf;
        size = WideCharToMultiByte(866, 0, wbuf, -1, NULL, 0, NULL, NULL);
        buf = (char*)calloc(sizeof(char), size);
        WideCharToMultiByte(866, 0, wbuf, -1, buf, size, NULL, NULL);
                cout<<buf;
Остался один вопрос. В чем разница между
string str =buf; // <-перекодированный "Добрый день"
и
str="Добрый день"
Yandex
Объявления
07.03.2014, 23:38     Как поменять кодировку?
Ответ Создать тему
Опции темы

Текущее время: 17:54. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru