![]() |
|
Модераторы: feodorv, GremlinProg, xvr, Fixin |
![]()
|
|
| sosedywka |
|
||||
|
Новичок Профиль Группа: Участник Сообщений: 7 Регистрация: 30.5.2011 Репутация: нет Всего: нет |
День добрый! Помогите, пожалуйста, разобраться с проблемой:
После нажатия кнопки в меню, должно открываться диалоговое окно "открытие файла", должен выбираться файл и читаться. Но если в файле находятся символы кириллицы, он выводит ерунду. Проверяю MessageBox'ом и Edit'ом вот код:
а также определение переменных:
Добавлено через 6 минут скрин вывода, скрин того, что должно выводиться прилагается. Присоединённый файл ( Кол-во скачиваний: 12 )
111.JPG 5,74 Kb |
||||
|
|||||
| sosedywka |
|
|||
|
Новичок Профиль Группа: Участник Сообщений: 7 Регистрация: 30.5.2011 Репутация: нет Всего: нет |
||||
|
||||
| volatile |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 2107 Регистрация: 7.1.2011 Репутация: 13 Всего: 85 |
sosedywka, у вас программа нормальная (ну смотрел правда по-диагонали)
У вас дело в другом. Файл который вы читаете должен быть в win-1251. А он у вас в UTF-8. (это я могу сказать точно, вижу просто по символам на картинке). Так что в блокноте сохраните ваш вайл в win-1251 (там он кажется ANSI называется). |
|||
|
||||
| sosedywka |
|
||||
|
Новичок Профиль Группа: Участник Сообщений: 7 Регистрация: 30.5.2011 Репутация: нет Всего: нет |
volatile, спасибо, вы правы, так и есть. В кодировке ANSI, все выводит верно, без малейших косяков. Но можно как то абстрагироваться от кодировки файла? Или, скажем проверять кодировку до чтения, а затем судя по ней читать в разные форматы (или разными функциями)? (Дело в том, что файлы не мои, и я не могу изменять их. Иначе, когда дело дойдет до сдачи, там эти косяки всплывут На MSDN нашел вот такое описание MessageBox: Unicode and ANSI names MessageBoxW (Unicode) and MessageBoxA (ANSI) вот ссылка:MSDN MessageBox Function Это единственное, что там сказано про эти функции, поэтому действовал методом тыка: Пробовал следующее:
где переменные: char szBuffer[500]; wchar_t szTempBuffer[500]; 2,3 MessageBox'ы не выводят даже латинские символы(что, в принципе, логично), 1,4 MessageBox'ы выводят все как раньше, т.е. кирилицу не воспринимают. Это сообщение отредактировал(а) sosedywka - 5.6.2011, 16:40 |
||||
|
|||||
| volatile |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 2107 Регистрация: 7.1.2011 Репутация: 13 Всего: 85 |
В силу сложившихся обстоятельств, русских кодировок, больше чем можно себе представить. Поддерживать все - задача практически не решаемая. Кроме того, нельзя определить однозначно кодировку файла, если она не известна. Есть правда утилиты, определяющие кодировку по частоте встречаемых символов, но для их работы нужно чтобы текст был достаточно большим. Да и все равно это все очень не надежно. В вашем случае, по 2-ум словам, да еще вперемежку с английскими... Короче, нужно чтобы кодировка файла, была определенная. Если входные файлы в кодировке UTF8, нужно вызывать конвертор в юникод так:
Но эта функция не удаляет BOM, это вам нужно будет сделать вручную (для UTF8 BOM = 0xef, 0xbb, 0xbf). Но учтите что BOM'а может и не быть, так что сначала нужно проверить. Да и кроме того, по секрету скажу, что UTF8, не родной формат винды, и работает она с ним кривовато. Добавлено через 1 минуту и 17 секунд И еще, не нужно юзать MessageBoxW MessageBoxA, это не для этого. используйте MessageBox |
|||
|
||||
| GremlinProg |
|
|||
|
Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 2706 Регистрация: 9.8.2005 Где: Тюмень Репутация: 99 Всего: 106 |
грубейшая ошибка, нельзя так делать:
с такими темпами, поместим ее в правила, т.к. ответ следует автоматический - неправильная работа с кодировками, от такого преобразования строка не будет преобразована в юникод, она так только будет обзываться, что еще больше запутает логику программы от кодировки файла не абстрагироваться, но можно дать возможность пользователю подобрать ее самому, если нет бомов (и даже если есть) -------------------- "Гений всегда разумнее, чем умнее. Ум — это машина, разум — водитель этой машины." |
|||
|
||||
| sosedywka |
|
|||
|
Новичок Профиль Группа: Участник Сообщений: 7 Регистрация: 30.5.2011 Репутация: нет Всего: нет |
Изменил кодировку блокнота на ANSI.
GremlinProg, Это я случайно оставил, когда пытался присвоить ofn.lpstrFile строку char. Потом тип изменил, а LPWSTR осталось. Спасибо, буду внимательней. volatile, Спасибо, я ознакомлюсь с функцией MultiByteToWideChar. Всем спасибо за участие |
|||
|
||||
![]()
|
| Правила форума "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. |