![]() |
|
Модераторы: feodorv, GremlinProg, xvr, Fixin |
![]()
|
|
| Dreamer_0x01 |
|
|||
![]() Терминатор ![]() ![]() Профиль Группа: Участник Сообщений: 780 Регистрация: 14.4.2005 Где: Санкт-Петербург Репутация: нет Всего: 12 |
Здравствуйте.
Проблема в следующем. Имею файлик, сгенерированный другой программой. Файлик состоит из слов, разделенных двоеточиями, и мне нужно прочитать эти слова из файла. Проблема в том, что слова представлены в какой-то двухбайтовой кодировке, скорее всего, unicode. Я проверил это, переименовав файл в htm и открыв в броузере, когда в параметрах броузера выставляю кодировку utf-8, то текст выглядит читаемо, все остальные кодировки дают кракозябры. Но сами двоеточия представлены одиночными байтами, я специально смотрел это в шестнадцатиричном редакторе, во всем файле буквы в словах кодируются двумя байтами, а двоеточия - одним. И что интересно, броузер и слова, и двоеточия отображает нормально. Но программно мне не получается считать такую смесь. Как я делаю - считываю по одному байту в буфер типа char.Когда дохожу до двоеточия, к полученному фрагменту применяю функцию WideCharToMultiByte(), подставив в нее еще один буфер типа char. Но вместо нужных символов я вижу знаки вопроса. Может, я не ту функцию применяю. или неправильно? Вот фрагмент кода:
Это сообщение отредактировал(а) Dreamer_0x01 - 8.5.2008, 14:22 -------------------- Нет ничего невозможного. Есть цели, и есть время и силы на их достижение. |
|||
|
||||
| Earnest |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Экс. модератор Сообщений: 5962 Регистрация: 17.6.2005 Где: Рязань Репутация: 33 Всего: 183 |
Какой-то странный UNICODE. А покажи кусочек данных, пару строк.
Вот это, кстати, неправильно: charsimbol-charbuf-1, Здесь должно быть число символов (широких!), а не байтов. И насчет кодировки у меня сомнения - вроде там указывается исходная кодировка? Т.е. CP_UTF8. Но насчет последнего не уверена. -------------------- ... |
|||
|
||||
| Rififi |
|
|||
|
Эксперт ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1254 Регистрация: 9.3.2008 Репутация: 2 Всего: 36 |
несколько замечаний по коду:
- под "WideChar" в Windows подразумевается Unicode UCS-2 - если строка содержит нуль-терминатор, то можно в каестве длинны строки передавать -1 - нет проверок на ошибки - UTF-8 считается multi-byte, поэтому его надо перекодировать в "честный unicode" так: CHAR utf8_source[] = ... WCHAR szBuf[1000]; int nChars = ::MultiByteToWideChar(CP_UTF8, 0, utf8_source, -1, szBuf, 1000); |
|||
|
||||
| maxim1000 |
|
|||
|
Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Участник Сообщений: 3334 Регистрация: 11.1.2003 Где: Киев Репутация: 2 Всего: 110 |
UTF-8 использует переменное количество байт для разных символов
насколько я припоминаю, для ASCII-шных используется 1 байт, для остальных - 2 так что ":" представляется одним байтом, а когда переходим на русские буквы - используются 2 -------------------- qqq |
|||
|
||||
| mes |
|
|||
|
любитель ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 7954 Регистрация: 14.1.2006 Репутация: 1 Всего: 250 |
ага.. основные символы представлены семью битами (то есть значениями от 0-127) остальные символы представлены группой от 2х до 4х байт где в каждый байт НЕ использует значения основных символов (то есть использует от 128-255) Добавлено через 5 минут и 33 секунды вот подробнее : http://ru.wikipedia.org/wiki/Unicode |
|||
|
||||
| Dreamer_0x01 |
|
||||
![]() Терминатор ![]() ![]() Профиль Группа: Участник Сообщений: 780 Регистрация: 14.4.2005 Где: Санкт-Петербург Репутация: нет Всего: 12 |
Rififi, помогло вот это!
Теперь у меня стоит пара таких конструкций:
Теперь у меня есть слово и в wchat_t *, и в char *, то, что нужно. Всем спасибо за экскурс в теорию, не ожидал, что юникод настолько заморочливая штука. Есть, и еще какая...Все вырезано, чтобы не загромождать пост лишним топиком ;) Это сообщение отредактировал(а) Dreamer_0x01 - 9.5.2008, 00:44 -------------------- Нет ничего невозможного. Есть цели, и есть время и силы на их достижение. |
||||
|
|||||
![]()
|
| Правила форума "C/C++: Системное программирование и WinAPI" | |
|
|
На данный раздел распространяются Правила форума и Правила раздела С++:Общие вопросы . Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Chipset, Step, Fixin, GremlinProg, xvr. feodorv. |
| 0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей) | |
| 0 Пользователей: | |
| « Предыдущая тема | C/C++: Системное программирование и WinAPI | Следующая тема » |
|
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |