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

С++ для начинающих

Войти
Регистрация
Восстановить пароль
 
Рейтинг: Рейтинг темы: голосов - 19, средняя оценка - 4.68
Sadboy
1 / 1 / 0
Регистрация: 05.03.2014
Сообщений: 9
#1

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

06.03.2014, 00:47. Просмотров 3072. Ответов 11
Метки нет (Все метки)

Здравствуйте. У меня есть строка с непонятной кодировкой.
string str="╨Ф╨╛╨▒╤А╤Л╨╣ ╨▓╨╡╤З╨╡╤А"; //Добрый вечер
Пробовал использовать функцию MultiByteToWideChar(), но перекодировать строку не удалось. Как привести текст в нормальный вид? если это вообще возможно...
Лучшие ответы (1)
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
06.03.2014, 00:47     Как поменять кодировку?
Посмотрите здесь:

Программа использовала многобайтовую кодировку. Решил поменять её на Юникод, но - C++
День всем добрый! Как, наверное, все уже здесь знают, я работаю над программой, которая при старте открывает файл. Если файл находится...

Как определить кодировку файла? - C++
Допустим, программа будет обрабатывать некий текстовый файл с зарание неизвестной кодировкой. Как можно на С++ программно правильно...

Как изменить кодировку символов - C++
Приветствую уважаемые форумчане, помогите пожалуйста с кодировками , в файл вместо ФИО записывает краказябры. Заранее благодарю. ...

Как изменить кодировку вывода? - C++
Доброе утро всем. Помогите новичку. Только начал изучать программирование на С++ (в среде Visual Studio 2008 express), и столкнулся с...

Как задать кодировку для TextOut? - C++
Как задать кодировку для TextOut?

Как на сервере задать кодировку символов - C++
Спасибо еще такой вопрос у меня есть tcp сервер на него с клиента приходят русские сообщения и в буфере на сервере получаются непонятные...

Как задать кодировку для заголовка окна? - C++
#include<iostream> #include<windows.h> using namespace std; int main() { SetConsoleCP(1251); SetConsoleOutputCP(1251); ...

После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Bend3r
149 / 136 / 18
Регистрация: 29.07.2012
Сообщений: 709
06.03.2014, 01:05     Как поменять кодировку? #2
Удалите этот текст и введите "Добрый вечер". Либо оно сразу автоматически вам меняет на крокозяблики?
Black Fregat
1381 / 1011 / 222
Регистрация: 31.05.2009
Сообщений: 4,240
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
Эксперт CАвтор FAQ
17544 / 5782 / 370
Регистрация: 30.03.2009
Сообщений: 15,927
Записей в блоге: 26
06.03.2014, 17:59     Как поменять кодировку? #5
Поэкспериментируй. Сначала меняй различные кодировки на входе, а потом смотри, какие конкретно числа получились в массиве wchar'ов. Если ты видишь набор значений, похожих на русские буквы (коды см. тут http://unicode-table.com/ru/sections/cyrillic/), значит ты угадал со входной кодировкой

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

Чтобы разобраться, нужно:
1. Читаемый файл.
2. Код, который читает строки
3. Код, который пишет в файл и/или выводит в консоль
Black Fregat
1381 / 1011 / 222
Регистрация: 31.05.2009
Сообщений: 4,240
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
Эксперт С++
7121 / 5298 / 273
Регистрация: 10.12.2010
Сообщений: 23,439
Записей в блоге: 17
07.03.2014, 21:27     Как поменять кодировку? #9
Вводим сюда http://www.artlebedev.ru/tools/decoder/ -проверяем CP866 → UTF-8
zer0mail
2330 / 1956 / 192
Регистрация: 03.07.2012
Сообщений: 7,013
Записей в блоге: 1
07.03.2014, 21:54     Как поменять кодировку? #10
У меня этот код изначально не работает, т.к. в str сразу записаны вопросики.
Black Fregat
1381 / 1011 / 222
Регистрация: 31.05.2009
Сообщений: 4,240
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     Как поменять кодировку?
Еще ссылки по теме:

Как подключить кодировку IBMcp866 в среде wxDev-C++ ? - C++
Подскажите как подключить кодировку IBMcp866. Есть мысль что так: setlocale(LC_ALL, &quot;.866&quot;; Правильно ли это?

Как узнать кодировку полученной строки аргумента main? - C++
В main отправляется аргумент-строка на русском из IDE CLion v 2016.2.3. Вывести этот аргумент на русском не получается, какую кодировку...

Как распознать кодировку текста при вводе из файла? - C++
Имеется файл с текстом, написанный в каком-то текстовом редакторе на каком-то человеческом языке. Программа должна считывать этот...

Как узнать кодировку вывода в консоль во время выполнения программы? - C++
Привет всем! Я новичок, и возникла идея написать консольное приложение для Windows которое принимает на ввод русские символы и также...

Как задать кодировку при записи в файл или чтения из него - C++
У меня блокнот Notepad++, своей программой я записываю в некоторый текстовый файл все символы ASCII. Проблема вот в чем: программа...


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

Или воспользуйтесь поиском по форуму:
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     Как поменять кодировку?
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru