Прочитать строки в utf8 из бинарного файла, Ищу решение |
Здравствуйте, гость ( Вход | Регистрация )
Прочитать строки в utf8 из бинарного файла, Ищу решение |
iddqd |
17.7.2010, 14:50
Сообщение
#1
|
Студент Группа: Участник Сообщений: 32 Регистрация: 26.11.2009 Пользователь №: 1261 Спасибо сказали: 1 раз(а) Репутация: 0 |
Есть бинарный файл, в котом местами встречаются строки в кодировке utf8, перед каждой такой строкой стоит её длина в виде qint32.
Вот пример:
06000000 - длина данных с текстом в байтах, D098D0BCD18F - слово "Имя" в utf8 Пытаюсь читать вот так:
В консоли вижу нечитаемый набор символов и знаков вопросов вместо текста. Как правильнее реализовать чтение данных в этом случае? Qt 4.6, Win32 |
|
|
DIMEDROLL |
17.7.2010, 15:32
Сообщение
#2
|
Участник Группа: Участник Сообщений: 165 Регистрация: 28.9.2008 Из: Киев Пользователь №: 304 Спасибо сказали: 23 раз(а) Репутация: 0 |
для начала попробуй так:
|
|
|
iddqd |
17.7.2010, 15:41
Сообщение
#3
|
Студент Группа: Участник Сообщений: 32 Регистрация: 26.11.2009 Пользователь №: 1261 Спасибо сказали: 1 раз(а) Репутация: 0 |
Вот этот вариант
даёт в консоли "Имя??????????" Вроде нормально, только откуда эти знаки вопроса? |
|
|
DIMEDROLL |
17.7.2010, 15:51
Сообщение
#4
|
Участник Группа: Участник Сообщений: 165 Регистрация: 28.9.2008 Из: Киев Пользователь №: 304 Спасибо сказали: 23 раз(а) Репутация: 0 |
подозреваю что ты неправильно считываешь размер строки и соотвественно читаешь данные которые находятся за строкой, а потом их конвертишь в строку
сколько у тебя labelLen выдает? |
|
|
iddqd |
17.7.2010, 15:54
Сообщение
#5
|
Студент Группа: Участник Сообщений: 32 Регистрация: 26.11.2009 Пользователь №: 1261 Спасибо сказали: 1 раз(а) Репутация: 0 |
labelLen после считывания равен 6. И 6 байт (по 2 байта на одну русскую букву в utf8) - это правильный размер данных с текстом.
|
|
|
iddqd |
17.7.2010, 17:06
Сообщение
#6
|
Студент Группа: Участник Сообщений: 32 Регистрация: 26.11.2009 Пользователь №: 1261 Спасибо сказали: 1 раз(а) Репутация: 0 |
Разобрался. Надо было явно указать размер данных. Вот так всё работает и выводится правильный текст без знаков вопросов.
Сообщение отредактировал iddqd - 17.7.2010, 17:07 |
|
|
Алексей1153 |
17.7.2010, 17:30
Сообщение
#7
|
фрилансер Группа: Участник Сообщений: 2941 Регистрация: 19.6.2010 Из: Обливион Пользователь №: 1822 Спасибо сказали: 215 раз(а) Репутация: 34 |
А инициализировать то кто будет?
char * label = new char [labelLen]; memset(label,0,sizeof(*label)*labelLen);//<<<<<<<< в общем, строка у тебя нулём не оканчивалась. Ещё полезно после заполнения массива (у тебя из in.readRawData) ставить принудительно ноль в конец массива label[labelLen-1]=0; |
|
|
iddqd |
17.7.2010, 18:50
Сообщение
#8
|
Студент Группа: Участник Сообщений: 32 Регистрация: 26.11.2009 Пользователь №: 1261 Спасибо сказали: 1 раз(а) Репутация: 0 |
Строка не оканчивалась нулем, проверил неоднократно.
Ваш вариант тоже работает корректно, спс. |
|
|
Алексей1153 |
17.7.2010, 20:08
Сообщение
#9
|
фрилансер Группа: Участник Сообщений: 2941 Регистрация: 19.6.2010 Из: Обливион Пользователь №: 1822 Спасибо сказали: 215 раз(а) Репутация: 34 |
вариант тоже работает корректно Хм, тогда что же делать с этим Строка не оканчивалась нулем, проверил неоднократно Когда же появляется не ноль? Загадка... ps Бессмертный ник тому виной, не иначе Сообщение отредактировал Алексей1153 - 17.7.2010, 20:09 |
|
|
iddqd |
17.7.2010, 20:43
Сообщение
#10
|
Студент Группа: Участник Сообщений: 32 Регистрация: 26.11.2009 Пользователь №: 1261 Спасибо сказали: 1 раз(а) Репутация: 0 |
Строка нулём не оканчивалась. Вот пример данных:
Цитата 06 00 00 00 D0 98 D0 BC D1 8F 30 00 00 00 D0 90 D0 B2 D1 82 .. 06 00 00 00 - quint32, размер данных с текстом 1й строки далее 6 байт - текст 1й строки потом сразу 30 00 00 00 - quint32, размер данных с текстом 2й строки далее 48 байт - текст 2й строки Под "тоже" имелось в виду, что при помощи QString::fromUtf8(label, labelLen) я получаю корректную строку аналогично методу предложенному вами. Только без дополнительной инициализации и дописывания 0 в конец массива. |
|
|
Текстовая версия | Сейчас: 29.11.2024, 1:38 |