![]() |
Модераторы: bsa |
![]() ![]() ![]() |
|
vicq |
|
|||
![]() Шустрый ![]() Профиль Группа: Участник Сообщений: 50 Регистрация: 21.12.2006 Где: Белгород Репутация: нет Всего: нет |
Дело было так: текст на датском языке в юникоде в текстовике. Открыл для чтения как текстовый файл ("r"). Первыми считались 2 символа, которых нет в текстовике. Потом начали считываться символы текстовика, но странным образом: Символ(латинский), потом мусор вроде \x0, потом символ(латинский) и т.д. в том же духе. Аски коды символов латиницы соответствуют им в таблице. Другие символы имеют код -10, -2 и т.д.
Проблема наверное в том, что текстовый файл считывается по 1 байту. т.е. символы с кодом больше 255 считываются некорректно. Тогда как считать этот текст? Может в бинарном режиме читать? Тогда подскажите функцию(наверное fread, напишите пожалуйста параметры для моего примера) Спасибо! Это сообщение отредактировал(а) vicq - 1.3.2009, 11:41 |
|||
|
||||
zim22 |
|
|||
![]() depict1 ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 2682 Регистрация: 15.1.2009 Где: Украина Репутация: 29 Всего: 69 |
используйте тип wchar_t вместо char или wstring вместо string
|
|||
|
||||
pan2004 |
|
|||
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 357 Регистрация: 28.7.2007 Репутация: 2 Всего: 9 |
они есть, этот спецсимвол указывает на кодировку текстового файла(UTF8, UTF16, UCS...) |
|||
|
||||
vicq |
|
|||
![]() Шустрый ![]() Профиль Группа: Участник Сообщений: 50 Регистрация: 21.12.2006 Где: Белгород Репутация: нет Всего: нет |
А getc или fread'ом это можно сделать?
|
|||
|
||||
vicq |
|
|||
![]() Шустрый ![]() Профиль Группа: Участник Сообщений: 50 Регистрация: 21.12.2006 Где: Белгород Репутация: нет Всего: нет |
В юникоде символ занимает 2 байта. Тогда почему
возвращает значения 1442038 и тому подобные...? Это сообщение отредактировал(а) vicq - 1.3.2009, 13:16 |
|||
|
||||
mes |
|
|||
любитель ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 7954 Регистрация: 14.1.2006 Репутация: 79 Всего: 250 |
![]() http://ru.wikipedia.org/wiki/%D0%A3%D0%BD%...%BA%D0%BE%D0%B4 ![]() Это сообщение отредактировал(а) mes - 1.3.2009, 14:11 |
|||
|
||||
zim22 |
|
|||
![]() depict1 ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 2682 Регистрация: 15.1.2009 Где: Украина Репутация: 29 Всего: 69 |
лови код
как работает функция fread можешь здесь почитать: http://www.cplusplus.com/reference/clibrar...tdio/fread.html Присоединённый файл ( Кол-во скачиваний: 9 ) ![]() |
|||
|
||||
pan2004 |
|
|||
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 357 Регистрация: 28.7.2007 Репутация: 2 Всего: 9 |
самое забавное здесь - размер wchar_t зависит от платформы(на Вин он 2, на Лине 4 байта), поэтому файл может и не прочитаться таким прямым способом. Кроме того, UTF ные кодировки таким образом тоже не прочитаешь(у них переменный размер символов)... |
|||
|
||||
vicq |
|
|||
![]() Шустрый ![]() Профиль Группа: Участник Сообщений: 50 Регистрация: 21.12.2006 Где: Белгород Репутация: нет Всего: нет |
только не понятно: максимальное значение кода по таблице юникод - 65536. переменный размер это 1 и 2 байта(коды до 255 и те, что после). так получается? тогда как с этим справиться? кстати, zim22, символы в твоем текстовике имеют коды до 255, т.е. занимают по 1 байту. |
|||
|
||||
pan2004 |
|
|||
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 357 Регистрация: 28.7.2007 Репутация: 2 Всего: 9 |
UCS4 занимает 4 байта, так что максимальное теоретическое значение составляет примерно 4 миллиарда символов. На самом деле, 65535 уже не хватает, и некоторые места "за 65 тысячами" уже заняты. Мало кто с ними встречался, так как там находятся относительно редкие символы(например из искусственных языков), но они существуют - это факт. UTF кодировки могут иметь размер символа от одного двух то ли до 6 то ли до 8 байт(точно не помню, см википедию). Загружают в память в массив байтов(char), потом спец функциями преобразуют к wchar_t строкам. Можно использовать специальные библиотеки, например ICU, в Qt QString поддерживает различные уникод форматы. Насчет стандартной библиотеки - в C++03 поддержка уникода сильно ограничена, но в C++09 должно появится много нового) Это сообщение отредактировал(а) pan2004 - 1.3.2009, 22:32 |
|||
|
||||
vicq |
|
|||
![]() Шустрый ![]() Профиль Группа: Участник Сообщений: 50 Регистрация: 21.12.2006 Где: Белгород Репутация: нет Всего: нет |
ICU - это то, что надо. Только документацию на русском найти бы... Может кто-нибудь знает где взять её?
На английском сложнее разобраться. |
|||
|
||||
zim22 |
|
|||
![]() depict1 ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 2682 Регистрация: 15.1.2009 Где: Украина Репутация: 29 Всего: 69 |
||||
|
||||
jonie |
|
|||
Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 5613 Регистрация: 21.8.2005 Где: Владимир Репутация: 6 Всего: 118 |
врешшшььь... это BOM для текста в кодировке UCS2. -------------------- Что-то не поняли? -> Напейтесь до зеленых человечков... эта сверхцивилизация Вам поможет... |
|||
|
||||
cutwater |
|
|||
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 592 Регистрация: 24.6.2008 Репутация: 2 Всего: 10 |
||||
|
||||
pan2004 |
|
|||
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 357 Регистрация: 28.7.2007 Репутация: 2 Всего: 9 |
Не только. По википедии, по этому символу(точнее по его кодированному виду) можно определить не только порядок байтов, но и какая из UTF/UCS кодировок используется. |
|||
|
||||
![]() ![]() ![]() |
Правила форума "C/C++: Для новичков" | |
|
Запрещается! 1. Публиковать ссылки на вскрытые компоненты 2. Обсуждать взлом компонентов и делиться вскрытыми компонентами
Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, JackYF, bsa. |
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей) | |
0 Пользователей: | |
« Предыдущая тема | C/C++: Для новичков | Следующая тема » |
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |