Форум программистов, компьютерный форум, киберфорум
Наши страницы

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

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

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

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

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

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

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

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

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

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

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

11
Bend3r
149 / 136 / 18
Регистрация: 29.07.2012
Сообщений: 709
06.03.2014, 01:05 #2
Удалите этот текст и введите "Добрый вечер". Либо оно сразу автоматически вам меняет на крокозяблики?
0
Black Fregat
2391 / 1206 / 299
Регистрация: 31.05.2009
Сообщений: 4,770
06.03.2014, 01:18 #3
Строка Utf-8 прочитана как 866. Соответственно, для обратного преобразования нужно закодировать эти символы в 866, а полученный набор байт прочитать как Utf-8
0
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;
На выходе получаю строку из вопросов... Явно что-то делаю не так)
0
Evg
Эксперт CАвтор FAQ
18884 / 6840 / 498
Регистрация: 30.03.2009
Сообщений: 19,260
Записей в блоге: 30
06.03.2014, 17:59 #5
Поэкспериментируй. Сначала меняй различные кодировки на входе, а потом смотри, какие конкретно числа получились в массиве wchar'ов. Если ты видишь набор значений, похожих на русские буквы (коды см. тут http://unicode-table.com/ru/sections/cyrillic/), значит ты угадал со входной кодировкой

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

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

Если это одноразовая задача, поменяйте кодировку в любом текстовом редакторе.
Если это многоразовая задача, ловите источник возникновения ошибки.
Этот источник там, где utf-8 читается как 866.
0
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...
0
Avazart
Эксперт С++
7574 / 5559 / 327
Регистрация: 10.12.2010
Сообщений: 24,934
Записей в блоге: 17
07.03.2014, 21:27 #9
Вводим сюда http://www.artlebedev.ru/tools/decoder/ -проверяем CP866 → UTF-8
0
zer0mail
2445 / 2079 / 205
Регистрация: 03.07.2012
Сообщений: 7,557
Записей в блоге: 1
07.03.2014, 21:54 #10
У меня этот код изначально не работает, т.к. в str сразу записаны вопросики.
0
Black Fregat
2391 / 1206 / 299
Регистрация: 31.05.2009
Сообщений: 4,770
07.03.2014, 22:34 #11
Лучший ответ Сообщение было отмечено автором темы, экспертом или модератором как ответ
InternetReadFile должен выдавать строку байт.
К ней нужно сразу применить MultiByteToWideChar.
И должно наступить Вам счастье.

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

Добавлено через 8 минут
Забыл уточнить, что MultiByteToWideChar (CP_UTF8, ...)
0
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="Добрый день"
0
07.03.2014, 23:38
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
07.03.2014, 23:38
Привет! Вот еще темы с ответами:

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

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

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

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


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

Или воспользуйтесь поиском по форуму:
12
Ответ Создать тему
Опции темы

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