1 / 1 / 0
Регистрация: 05.03.2014
Сообщений: 9
|
|
1 | |
Как поменять кодировку?06.03.2014, 00:47. Показов 18383. Ответов 11
Метки нет (Все метки)
Здравствуйте. У меня есть строка с непонятной кодировкой.
string str="╨Ф╨╛╨▒╤А╤Л╨╣ ╨▓╨╡╤З╨╡╤А"; //Добрый вечер Пробовал использовать функцию MultiByteToWideChar(), но перекодировать строку не удалось. Как привести текст в нормальный вид? если это вообще возможно...
0
|
06.03.2014, 00:47 | |
Ответы с готовыми решениями:
11
Как поменять кодировку локали Программа использовала многобайтовую кодировку. Решил поменять её на Юникод, но Как поменять кодировку? Как поменять кодировку? |
150 / 137 / 35
Регистрация: 29.07.2012
Сообщений: 709
|
|
06.03.2014, 01:05 | 2 |
Удалите этот текст и введите "Добрый вечер". Либо оно сразу автоматически вам меняет на крокозяблики?
0
|
Фрилансер
3705 / 2077 / 567
Регистрация: 31.05.2009
Сообщений: 6,683
|
|
06.03.2014, 01:18 | 3 |
Строка Utf-8 прочитана как 866. Соответственно, для обратного преобразования нужно закодировать эти символы в 866, а полученный набор байт прочитать как Utf-8
0
|
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
|
06.03.2014, 17:59 | 5 |
Поэкспериментируй. Сначала меняй различные кодировки на входе, а потом смотри, какие конкретно числа получились в массиве wchar'ов. Если ты видишь набор значений, похожих на русские буквы (коды см. тут http://unicode-table.com/ru/sections/cyrillic/), значит ты угадал со входной кодировкой
А дальше ставь нужную выходную. В виндузовой консоли вроде бы как это и есть 866, но точно не знаю
0
|
06.03.2014, 22:29 | 6 |
Кодировки - это еще те грабли Надо ясно представлять задачу, а фраза "поменять" малоинформативна
Есть источник (например, входной файл), память, выходной файл, консоль... Где именно, что и на что нужно поменять? Чтобы разобраться, нужно: 1. Читаемый файл. 2. Код, который читает строки 3. Код, который пишет в файл и/или выводит в консоль
0
|
Фрилансер
3705 / 2077 / 567
Регистрация: 31.05.2009
Сообщений: 6,683
|
|
07.03.2014, 15:53 | 7 |
Вот поясните мне, не проще ли сразу при чтении этого файла задать кодировку utf-8?
Зачем Вы ситаете эти кракозябры как 866, а потом как-то перекодируете? Если это одноразовая задача, поменяйте кодировку в любом текстовом редакторе. Если это многоразовая задача, ловите источник возникновения ошибки. Этот источник там, где utf-8 читается как 866.
0
|
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
|
07.03.2014, 21:27 | 9 |
Вводим сюда http://www.artlebedev.ru/tools/decoder/ -проверяем CP866 → UTF-8
0
|
Фрилансер
3705 / 2077 / 567
Регистрация: 31.05.2009
Сообщений: 6,683
|
|
07.03.2014, 22:34 | 11 |
Сообщение было отмечено Sadboy как решение
Решение
InternetReadFile должен выдавать строку байт.
К ней нужно сразу применить MultiByteToWideChar. И должно наступить Вам счастье. А кракозябры у Вас, вероятнее всего, получились из-за того, что эти несчастные символы туда-сюда гоняли через дурную консоль Windows, у которой кодировка не совпадает с системной, специально, чтобы программистам жизнь мёдом не казалась.. Добавлено через 8 минут Забыл уточнить, что MultiByteToWideChar (CP_UTF8, ...)
0
|
1 / 1 / 0
Регистрация: 05.03.2014
Сообщений: 9
|
||||||
07.03.2014, 23:38 [ТС] | 12 | |||||
Все получилось, не знаю почему раньше не получалось, наверно в кодировках запутался.
string str =buf; // <-перекодированный "Добрый день" и str="Добрый день"
0
|
07.03.2014, 23:38 | |
07.03.2014, 23:38 | |
Помогаю со студенческими работами здесь
12
Как поменять кодировку? Как поменять кодировку? как кодировку поменять Как поменять кодировку Qt 5.1.1 Искать еще темы с ответами Или воспользуйтесь поиском по форуму: |