Реализовать нечто вроде strings -e=UTF-8 в бинарном файле
От: Mna 404 and heavy formation
Дата: 11.01.18 15:48
Оценка:
Дано:
Есть бинарный файл большого размера (дамп дискового раздела или под линукс/юникс само это устройство как файл)
Есть доступ на чтение этого устройства

Требуется:
Искать в нем строки так как это делает юниксовая команда strings(1) однако искать юникодные строки в UTF-8
искать в этом формате, в частности, кириллические и прочие нелатинские строки.
Согласно документации strings поддерживает кодировку UTF-16/UCS-2:
однако нет нигде никаких упоминаний что она поддерживает UTF-8

-e encoding
--encoding=encoding
Select the character encoding of the strings that are to be found.
Possible values for encoding are: s = single-7-bit-byte characters
(ASCII, ISO 8859, etc., default), S = single-8-bit-byte characters,
b = 16-bit bigendian, l = 16-bit littleendian, B = 32-bit
bigendian, L = 32-bit littleendian. Useful for finding wide
character strings. (l and b apply to, for example, Unicode
UTF-16/UCS-2 encodings).


Прикладной смысл:
Хочется найти данные или спасти данные, а для этого для начала найти их в файле.
Или если их там нет, самому нормально убедиться в этом.

Хочется сделать такой инструмент для поиска, ибо как я понял такой вещи пока не существует.
Гугл результатов мне не дал.
  кроме таких
кроме таких
Do C++11 regular expressions work with UTF-8 strings?
https://stackoverflow.com/questions/11254232/do-c11-regular-expressions-work-with-utf-8-strings
// утверждается что магия поиска в URF-8 работает однако-как — непонятно, либо Boost.Regex либо ICU regex

Boost.Regex //где-то в глубинах утверждается что сия магия должна как-то работать:
// Transparently search Unicode strings that are encoded as either UTF-8, UTF-16 or UTF-32.

ICU regex //основан на коде Java 1.4 значит там должно быть UCS-2

также ссылаются на
http://www.pcre.org/
которое утверждает что оно как-то умеет все три вида(*) матчить (* UTF-8, UTF-16, or UTF-32 )

либо найдется путь сделать это без конвертаций*) — тогда все ОК, магия заработает — либо нет и тогда вот так:

*)Предполагаю реализовать это дело через "грязный хак" искать строки формата utf-8 конвертировать их в utf-16
далее искать в этих данных путем применения библиотеки regex-для-unicode где регексом будет нечто вроде [А-Яа-я] и прочие [::Alpha::-::Omega::]
и далее как-то находить смещение в исходных данных, может даже как-то конвертировать их обратно

Собственно Вопрос!
Если кто-то сталкивался какие подводные камни, как это лучше реализовать (поиск по буфферам надо будет как-то склеивать чтоб искать второй раз на стыке и т.п.)
Если кто в теме этих веще буду рад любому толковому совету.
Из предыдущего моего сталкивания с юникодами и регекспами много лет назад помнится юникодные кодировки та еще была "неудачная" тема...


Не уверен, в правильную ли ветку пишу, если нет пусть модератора переправят
По-видимому самые правильные инструменты будут как раз C/C++
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.