Форум программистов, компьютерный форум, киберфорум
Наши страницы
С++ для начинающих
Войти
Регистрация
Восстановить пароль
 
Рейтинг 4.75/4: Рейтинг темы: голосов - 4, средняя оценка - 4.75
lordimid
3 / 3 / 0
Регистрация: 02.10.2011
Сообщений: 104
#1

Парсер, utf-8

11.04.2015, 00:40. Просмотров 660. Ответов 9
Метки нет (Все метки)

Помогите пожалуйста разобраться с кодировкой. Прочитал немного статей и литературы, но полного понимание ситуации с кодировкой так и нет. Пишу простой парсер, который считывает код странички с интернета с помощью функций WinInet. При считывании страницы с кодировкой utf-8, у меня, на том месте где следуют русские символы, появляются "крякозябры". Прочитав несколько статей я сделал вывод (не знаю правильный или нет, если нет то поправьте пожалуйста), что страница читается некорректно, потому что в функции
C++
1
2
char szData[1000];
BOOL bRead =InternetReadFile(hRequest,szData,sizeof(szData),&dwBytesRead);
я использую восьмибитный буфер, и, следовательно, там где начинается кирилица одного байта становится недостаточно. Значит, чтобы решить проблему, нужно в качестве буфера предоставить строку типа
C++
1
wchar_t szData[1000]
в которую по идее должны помещаться двухбайтовые символы Юникода. Сделал я таким образом, но на выходе получается абсолютно нечитаемый текст. Скажите пожалуйста, где ошибка в моих суждениях и в каким направлении мне двигаться? Заранее благодарен.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
11.04.2015, 00:40
Ответы с готовыми решениями:

Конвертация из ASCII в UTF-32 или UTF-8 в UTF-32
Собсно сабж.

Преобразовние Utf-16 <=> Utf-8
Вопрос казалось бы простой, но нормально ответа на него я пока не нашел. Нужно...

C и UTF-8
Как для приложения на C установить кодировку UTF-8? Чтобы символы на кирилице...

C++, UTF-8 и совместимость
Имеется некоторая программа (шутка, прога ещё в проекте). Она по сути является...

Кириллица в UTF-8
Отдельно задам ранее возникший вопрос. При работе с однобайтовой кодировкой...

9
hoggy
Нарушитель
Эксперт С++
7054 / 3100 / 643
Регистрация: 15.11.2014
Сообщений: 7,062
Завершенные тесты: 1
11.04.2015, 00:43 #2
Цитата Сообщение от lordimid Посмотреть сообщение
в каким направлении мне двигаться?
куда то в эту сторону:

http://www.codeproject.com/Articles/14637/UTF-With-C-in-a-Portable-Way
0
lss
930 / 859 / 355
Регистрация: 10.10.2012
Сообщений: 2,705
11.04.2015, 05:49 #3
Цитата Сообщение от lordimid Посмотреть сообщение
При считывании страницы с кодировкой utf-8, у меня, на том месте где следуют русские символы, появляются "крякозябры".
Это где видно? Куда вывод делается?

Добавлено через 3 часа 2 минуты
Цитата Сообщение от lordimid Посмотреть сообщение
где ошибка в моих суждениях
Насколько я понимаю, там идёт побайтовое чтение, поэтому тип буфера, для чтения, не важен. Важно - правильно обработать сырые байты, из этого буфера, при выводе.
1
Enno
267 / 170 / 40
Регистрация: 25.08.2014
Сообщений: 1,087
Записей в блоге: 1
11.04.2015, 07:11 #4
Цитата Сообщение от lordimid Посмотреть сообщение
но на выходе получается абсолютно нечитаемый текст.
Есть такая функция MultiByteToWideChar(). Посмотри что вернёт она и что возвращает твой алгоритм. Если Разница есть, то у тебя косяк в алгоритме.
1
lordimid
3 / 3 / 0
Регистрация: 02.10.2011
Сообщений: 104
11.04.2015, 10:05  [ТС] #5
lss
Это где видно? Куда вывод делается?
Вывод делается в редактор текста "WC_EDIT".

Enno
Есть такая функция MultiByteToWideChar()
Эта функция помогла. Результат теперь читаемый.

Проверьте пожалуйста ход моих мыслей: правильно ли я рассуждаю?
Сначала передаю ANSI строку в функцию MultiByteToWideChar, указываю результирующую кодировку и получаю количество символов , которое будет у этой же строки в Unicode кодировке.
C++
1
2
char  szData[1024];
int num=MultiByteToWideChar(CP_UTF8, 0, szData, -1, NULL, 0);
Затем повторно вызываю функцию MultiByteToWideChar и предоставляю ей в качестве выходного буфера строку типа TCHAR.
C++
1
2
TCHAR szDataWide[5000];
MultiByteToWideChar(CP_UTF8, 0, szData, dwBytesRead ,szDataWide, num);
Лучше конечно с
C++
1
new
и
C++
1
delete
, но для понимания принципа и так сойдет.
Результирующая строка будет в Unicode кодировке UTF-8.
0
nmcf
6271 / 5577 / 2537
Регистрация: 14.04.2014
Сообщений: 23,468
11.04.2015, 10:19 #6
Цитата Сообщение от lordimid Посмотреть сообщение
Сначала передаю ANSI строку в функцию MultiByteToWideChar
Не ANSI, а UTF-8. Unicode везде, только в разном представлении.
1
lordimid
3 / 3 / 0
Регистрация: 02.10.2011
Сообщений: 104
28.08.2015, 20:21  [ТС] #7
Подскажите пожалуйста, функция MultiByteToWideChar возвращает количество в символах или нет? Дело в том, что в следующем примере, при попытке парсить авито, num равняется 19, хотя по идее должно равняться 10 или я не прав?

C++
1
2
3
4
5
6
...
CHAR  szData[10];
DWORD dwBytesRead;
BOOL bRead =InternetReadFile(hRequest,szData,sizeof(szData), &dwBytesRead);
int num = MultiByteToWideChar(CP_UTF8, 0, szData, -1, NULL, 0);
...
0
nmcf
6271 / 5577 / 2537
Регистрация: 14.04.2014
Сообщений: 23,468
28.08.2015, 20:47 #8
В символах.
Почему 10?
0
lordimid
3 / 3 / 0
Регистрация: 02.10.2011
Сообщений: 104
28.08.2015, 23:11  [ТС] #9
Размер строки szData равен 10. Как может быть количество символов больше чем считанных байтов?

Добавлено через 2 минуты
Максимально может быть 10 символов, откуда 19?
0
Enno
267 / 170 / 40
Регистрация: 25.08.2014
Сообщений: 1,087
Записей в блоге: 1
29.08.2015, 08:04 #10
Цитата Сообщение от lordimid Посмотреть сообщение
откуда 19?
Ты поставил -1 в качестве размера. А стоит ли у тебя '\0' в конце строки szData? Неизвестно. Передавай вместо -1 значение считанных байт dwBytesRead.
1
29.08.2015, 08:04
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
29.08.2015, 08:04

From UTF-8 to UNICODE
здравствуйте!! у меня вот какой вопрос! Как сделать преобразование UTF-8 и...

C++, UTF-8, char
Приветсвую всех. Правильно ли я рассуждаю: 1) Если мне нужно использовать...

Кириллицу в UTF-8
К примеру, у нас есть строка &quot;тест&quot;, нужно из него получить строку...


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

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

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