Дано:
Есть бинарный файл большого размера (дамп дискового раздела или под линукс/юникс само это устройство как файл)
Есть доступ на чтение этого устройства
Требуется:
Искать в нем строки так как это делает юниксовая команда 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++