Как определить кодировку DOS

Программирование на Visual Basic for Applications
litvin22
Начинающий
Начинающий
 
Сообщения: 14
Зарегистрирован: 01.06.2007 (Пт) 17:30
Откуда: Ставрополь

Как определить кодировку DOS

Сообщение litvin22 » 20.06.2007 (Ср) 14:30

Как определить кодировку DOS

Надо читать из текстовых файлов, которые могут содержать русский текст
или ASCII (альтернативная DOS-кодировка, кодовая страница 866)
или ANSI (кодировка Windows, кодовая страница 1251).
Какая именно кодировка в конкретном файле заранее не известно.
Файлы содержат преимущественно английские и цифровые символы, русских очень мало, только несколько слов. Поэтому провести анализ (подсчитать число частовстречаемых букв о, р, п, а, как предлагает, например hCORe) нельзя.
OemToChar, естественно, делает нечитаемым русский ANSI
То же самое при парном использовании WideCharToMultiByte и MultiByteToWideChar (предложил lister)
Вообще-то можно выводить текст на экран и конвертировать по команде пользователя, но это как-то нехорошо.

Решение есть, не 100%, но довольно действенное
Смотрите ниже.
Последний раз редактировалось litvin22 21.06.2007 (Чт) 9:38, всего редактировалось 1 раз.

tyomitch
Пользователь #1352
Пользователь #1352
Аватара пользователя
 
Сообщения: 12822
Зарегистрирован: 20.10.2002 (Вс) 17:02
Откуда: חיפה

Сообщение tyomitch » 20.06.2007 (Ср) 16:21

Определить по тексту его кодировку со 100% попаданием невозможно.
Иначе бы не было старой дурацкой байки про Буша, скрывшего факты в Блокноте.

Так что или спрашивать у пользователя, или выбирать наугад.
Изображение

litvin22
Начинающий
Начинающий
 
Сообщения: 14
Зарегистрирован: 01.06.2007 (Пт) 17:30
Откуда: Ставрополь

Сообщение litvin22 » 20.06.2007 (Ср) 18:10

Опредлить-то невозможно, но может есть еще какие-нибудь функции, кроме тех, что я пытался использовать?

tyomitch
Пользователь #1352
Пользователь #1352
Аватара пользователя
 
Сообщения: 12822
Зарегистрирован: 20.10.2002 (Вс) 17:02
Откуда: חיפה

Сообщение tyomitch » 20.06.2007 (Ср) 18:15

Функций много разных.
Какая цель?
Изображение

litvin22
Начинающий
Начинающий
 
Сообщения: 14
Зарегистрирован: 01.06.2007 (Пт) 17:30
Откуда: Ставрополь

Сообщение litvin22 » 20.06.2007 (Ср) 18:38

Ну, как какая
Получить читабельный текст из файла, независимо от кодировки.
Записать его в строковую переменную и дальше использовать.
Конечная цель - импорт las-файлов в Corel, только какое это имеет значение

tyomitch
Пользователь #1352
Пользователь #1352
Аватара пользователя
 
Сообщения: 12822
Зарегистрирован: 20.10.2002 (Вс) 17:02
Откуда: חיפה

Сообщение tyomitch » 20.06.2007 (Ср) 18:54

Если файл имеет неизвестную кодировку, то получить из него читабельный текст невозможно.
Изображение

Хакер
Телепат
Телепат
Аватара пользователя
 
Сообщения: 16478
Зарегистрирован: 13.11.2005 (Вс) 2:43
Откуда: Казахстан, Петропавловск

Сообщение Хакер » 20.06.2007 (Ср) 21:05

Bred2r умеет очень точно угадывать кодировку текста, кстати. Так что способ угадывания всё-таки есть. Мне кажется, бред определяет по недопустимости использования в тексте (в читабельном) каких-либо символов.
—We separate their smiling faces from the rest of their body, Captain.
—That's right! We decapitate them.

tyomitch
Пользователь #1352
Пользователь #1352
Аватара пользователя
 
Сообщения: 12822
Зарегистрирован: 20.10.2002 (Вс) 17:02
Откуда: חיפה

Сообщение tyomitch » 20.06.2007 (Ср) 21:31

Для коротких текстов никак не угадаешь.
Вот например, слова "эр" в 866 и "на" в 1251 выглядят одинаково. А "его" в 1251 вообще превращается в непристойность.
Уверен, что и более длинные примеры можно подобрать, просто мне щас лень.
Изображение

litvin22
Начинающий
Начинающий
 
Сообщения: 14
Зарегистрирован: 01.06.2007 (Пт) 17:30
Откуда: Ставрополь

Сообщение litvin22 » 21.06.2007 (Чт) 9:40

Решение есть, не 100%, но довольно действенное

Наконец-таки нашел альтернативную кодовую страницу 866 в древней книге "MS-DOS 6.2". В интернете, как ни странно, не смог.
Русские буквы в ней имеют коды в диапазонах 128-175 и 224-239.
А странице 1251 Windows в диапазоне 192-255, 168 Ё, 184 ё

Если принять:
1. Необходимо выбирать только между DOS и Windovs, никаких koi-8 и т.п.
2. В тексте только английские и русские символы, никаких немецких и чешских и т.п.
то кодировку определяем по правилу:
есть символы с кодом 128-175 => dos, применяем OemToChar

В этот диапазон всходят все прописные русские буквы и половина строчных. Для пущей уверенности из него можно исключить 168 Ё, 155 >, 166 |, 171 кавычки, 150 и 151 короткий и длинный дефис и т.п.. Но в txt файлах эти символы обычно не встречаются.

Разумеется, возможна ошибка, но она возникает, когда русские слова состоят только из букв р-я. То есть вероятность довольно маленькая.

tyomitch
Пользователь #1352
Пользователь #1352
Аватара пользователя
 
Сообщения: 12822
Зарегистрирован: 20.10.2002 (Вс) 17:02
Откуда: חיפה

Сообщение tyomitch » 21.06.2007 (Чт) 10:00

litvin22 писал(а):Наконец-таки нашел альтернативную кодовую страницу 866 в древней книге "MS-DOS 6.2". В интернете, как ни странно, не смог.

ORLY?
http://en.wikipedia.org/wiki/Code_page_866
http://ru.wikipedia.org/wiki/Альтернативная_кодировка
Изображение


Вернуться в VBA

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 120

    TopList