как можно определить являеться ли файл бинарным или текстовым? просьба учитывать все енкодинги возможные в .NET... по преабулам уже детекчу, но это не дает гарантий...
A>как можно определить являеться ли файл бинарным или текстовым? просьба учитывать все енкодинги возможные в .NET... по преабулам уже детекчу, но это не дает гарантий...
Давай определение текстового файла. Вот например, html — это текст или не текст. (Давно-давно на этот вопрос один знакомый ответил: нет, не текст.. это... это.. гипертекст! )
Когда определение будет — то есть задача будет поставлена нормально — то ответ придет сам собой.
Здравствуйте, Igor Trofimov, Вы писали:
A>>как можно определить являеться ли файл бинарным или текстовым? просьба учитывать все енкодинги возможные в .NET... по преабулам уже детекчу, но это не дает гарантий...
iT>Давай определение текстового файла. Вот например, html — это текст или не текст. (Давно-давно на этот вопрос один знакомый ответил: нет, не текст.. это... это.. гипертекст! )
iT>Когда определение будет — то есть задача будет поставлена нормально — то ответ придет сам собой.
Сдается мне, что вопрос определен довольно четко. Бинарные файлы есть бинарные. Определение я тебе могу дать. Текстовый файл — это файл который может читать человек используя плэйн-текст-редактор вроде ноотпэда. ХТМЛ, ХМЛ и т.п. входят в это понятие. Теперь попробуй дать ответ.
ЗЫ
Человек спрашивает об алгоритме определения того является ли файл тексовым или бинарным. В принципе это заключение можно сделать по наличию в файле некоторых непечатных символов, но файл может быть юникодным, что усложняет задачу.
... << RSDN@Home 1.1.4 beta 1 >>
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Здравствуйте, VladD2, Вы писали:
VD>Сдается мне, что вопрос определен довольно четко. Бинарные файлы есть бинарные. Определение я тебе могу дать. Текстовый файл — это файл который может читать человек используя плэйн-текст-редактор вроде ноотпэда. ХТМЛ, ХМЛ и т.п. входят в это понятие. Теперь попробуй дать ответ.
Текстовый — частный случай, бинарный — общий, так ведь?
Задача — отделить случай, когда файл НЕ является текстовым.
А текстовые редакторы бывают разные. "Вроде ноутпада" — расплывчато как-то.
Компьютер — совершенно незаменимая вещь: он позволяет решать такие проблемы, которые без него даже не возникают!
Здравствуйте, Воронков Василий, Вы писали:
ВВ>Можно сканировать файл на наличие нулевых байтов и, если они будут найдены, расценивать его как бинарный.
Это может оказаться юникодовый текстовик.
Компьютер — совершенно незаменимая вещь: он позволяет решать такие проблемы, которые без него даже не возникают!
Здравствуйте, Vovo4K, Вы писали:
VK>Здравствуйте, Воронков Василий, Вы писали:
ВВ>>Можно сканировать файл на наличие нулевых байтов и, если они будут найдены, расценивать его как бинарный.
VK>Это может оказаться юникодовый текстовик.
я щас придумал пару альтернатив:
1. частотный анализ файла... в принципе решенье по уму, но требует много статистики для каждого енкодинга... так делает FAR, но и он иногда ошибаеться...
2. если в файле находиться последовательность нулей от четырех и выше... т.е. если мы находим последовательность из четырех нулевых байт, то с довольно большой вероятностью можно сказать что файл бинарный... но не на все файлы работает...
уникоуд как раз не самая большая проблема, проблема в UTF раскладках у них символ могет занимать от одного до четырех байт... и вот тут как раз главное не ошибиться...
я бы остановился на первом, но меня очень смущает получение статистики... как мне например для китайского/иврита/арабского статистику получить?!
Здравствуйте, alku, Вы писали:
A>может еще что-то предложите?!
по-любому придется накапливать некую статистику и при превышении некоторого уровня считать файл текстовым/не-текстовым.
Можно попробовать составить статистику по встречаемости комбинации "0x0D 0x0A"
1) если встречаются только в такой связке (менее вероятный случай — наоборот, но не раздельно) — большая прибавка в пользу гипотезы "текстовый"
2) если встречаются только ЛИБО 0x0D, ЛИБО 0x0A — не очень большая прибавка, но тоже в пользу текстовой версии.
3) если встречается и то, и другое, причем как попало — прибавка в пользу гипотезы "бинарный".
Еще можно смотреть наличие не только нулей, но вообще символов с ASCII-кодом меньше 9 (TAB). В текстовых файлах их, скорее всего, быть не должно.
Как-то так.
ЗЫ: Ну и случай Юникода — надо, скорее всего, проверять отдельным алгоритмом.
Компьютер — совершенно незаменимая вещь: он позволяет решать такие проблемы, которые без него даже не возникают!
Здравствуйте, alku, Вы писали:
A>как можно определить являеться ли файл бинарным или текстовым? просьба учитывать все енкодинги возможные в .NET... по преабулам уже детекчу, но это не дает гарантий...
A>жду идей
Здравствуйте, Воронков Василий, Вы писали:
ВВ>Можно сканировать файл на наличие нулевых байтов и, если они будут найдены, расценивать его как бинарный.
В юникодном файле каждый второй может оказаться нулевым.
... << RSDN@Home 1.1.4 beta 1 >>
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
VD>Сдается мне, что вопрос определен довольно четко. Бинарные файлы есть бинарные. Определение я тебе могу дать. Текстовый файл — это файл который может читать человек используя плэйн-текст-редактор вроде ноотпэда.
"Может читать человек" — это четкое определение? Нда..
А если он часть может прочитать, а часть — не может? А если там одни буквы "а" и "ы" без пробелов — это тоже текстовый файл? Прочитать-то можно. То есть текстовый файл — это файл не содержащих нечитаемых символов? Тогда, думаю, решение очевидно.
Или нужно, чтобы можно было прочитать и текст был осмысленным?
Нет — нужно все-таки давать определение четче.
VD>Человек спрашивает об алгоритме определения того является ли файл тексовым или бинарным. В принципе это заключение можно сделать по наличию в файле некоторых непечатных символов, но файл может быть юникодным, что усложняет задачу.
Верно, кодировки и уникод тоже надо учесть в определении. А что касается непечатных символов, то в бинарнике их может случайно не оказаться Хотя с другой стороны, бинарник внутри может с определенной вероятностью оказаться текстом "Войны и мира" с переставленными словами
Возможно человеку сгодится анализ частоты символов разделителей и распределения длины "слов".
Здравствуйте, alku, Вы писали:
A>как можно определить являеться ли файл бинарным или текстовым? просьба учитывать все енкодинги возможные в .NET... по преабулам уже детекчу, но это не дает гарантий...
А может бвть подойти немного с другой стороны?
Для чего требуется узнать бинарный это файл или текстовый?
Здравствуйте, mihailik, Вы писали:
M>Другими словами, если файл содержит только обычные буквы — это текст? UUEncode, к примеру, или Base64 выдаёт текстовый файл?
В бинарном файле не может быть довольно ограниченное число символв. В основном от нуля до 12 (или больше, точно не помню). Другое дело что есть юникод в котором симвло имеет другой размер и если анализировать по байтно, то не трудно пол символа принять за бинарные данные. Но есть алгоритмы определения юникода. Так ноотпэд перкрасно распознает юникодные файлы по их Х символам.
M>Если же текстом считать только то, что может читать человек, то вопрос в человеке. Я вот в арабском текстовом файле ни бельмеса не пойму.
Человек понятие собирательное. Это не одна личность, а вид животных.
... << RSDN@Home 1.1.4 beta 1 >>
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Здравствуйте, GuinPin, Вы писали:
GP>Здравствуйте, alku, Вы писали:
A>>как можно определить являеться ли файл бинарным или текстовым? просьба учитывать все енкодинги возможные в .NET... по преабулам уже детекчу, но это не дает гарантий...
GP>А может бвть подойти немного с другой стороны? GP>Для чего требуется узнать бинарный это файл или текстовый?
есть текстовый редактор (не мой), он падает когда его просят открыть бинарный файл... чтобы хоть как-то от него добиться стабильности хочу поставить на его входе проверку типа данных...
в идиале редактор должен сам это коректно отрабатывать... но как видно не судьба
Здравствуйте, alku, Вы писали:
A>Здравствуйте, GuinPin, Вы писали:
GP>>Здравствуйте, alku, Вы писали:
A>>>как можно определить являеться ли файл бинарным или текстовым? просьба учитывать все енкодинги возможные в .NET... по преабулам уже детекчу, но это не дает гарантий...
GP>>А может бвть подойти немного с другой стороны? GP>>Для чего требуется узнать бинарный это файл или текстовый?
A>есть текстовый редактор (не мой), он падает когда его просят открыть бинарный файл... чтобы хоть как-то от него добиться стабильности хочу поставить на его входе проверку типа данных...
A>в идиале редактор должен сам это коректно отрабатывать... но как видно не судьба
Погоди. Редактор падает в момент открытия файла. Точку, в которой он падает можно отследить, выяснить причину и поставить обработчик исключительной ситуации.
После чего останется погонять его на заведомо текстовых файлах на предмет проверки может ли он послать нафиг текстовый файл. Если может, то уже разбираться из-за чего.
ЗЫЖ Таким макаром и выяснишь что есть текстовый файл, а все остальное считай бинарными
Здравствуйте, GuinPin, Вы писали:
GP>Здравствуйте, alku, Вы писали:
GP>Погоди. Редактор падает в момент открытия файла. Точку, в которой он падает можно отследить, выяснить причину и поставить обработчик исключительной ситуации. GP>После чего останется погонять его на заведомо текстовых файлах на предмет проверки может ли он послать нафиг текстовый файл. Если может, то уже разбираться из-за чего. GP>ЗЫЖ Таким макаром и выяснишь что есть текстовый файл, а все остальное считай бинарными
так он зараза через раз открывает... да и вообще стал очень интересен алгоритм определения...