Хочу сделать функцию замены текста в файлах используя в будущем поиск файлов. У нас есть разные кодировки, то есть функционал должен определять кодировку, по крайней мере WIN1251, UTF-8, UTF-16LE. Проблема пока "UTF-8 без BOM", то есть под флаг #PB_Ascii надо сделать ещё подфункцию определения "UTF-8 без BOM". Также при тесте в Linux столкнулся с тем, что #PB_Ascii не подразумевает Win-1251, а скорее 1252, хотя в Windows есть подозрение, что будет нормально, т.е. Win-1251, но я то хочу кроссплатформенную.
Ещё момент не столько важный, но всё же: в AutoIt понятие строки/текста определялись все символы, включая бинарные и Null, то есть я мог открыть любой бинарный файл целиком в текстовую переменную и все функции по замене текста (аналог ReplaceString), поиск, обрезка, все работали, даже если искомый текст был также с бинарными символами, кроме регулярных выражений, там всего лишь нельзя было использовать Null в явном виде в шаблоне регулярного выражения (наличие в переменной). То есть такой вариант, как я понял не смогу использовать, так как даже если я прочитаю данные в память, то как я заставлю строковые функции работать с ними.
Итог:
1. Нужна функция определения "UTF-8 без BOM" в #PB_Ascii
2. Предоставить пользователю воспринимать #PB_Ascii как Win-1251 в Linux
3. Отдалённая перспектива определять кодировки автоматически для #PB_Ascii (KOI8R, 866), в 99% мне не понадобиться.
4. Придумать что-то для бинарных файлов, то есть перевести бинарные данные в строку, например 00 в идентичный текстовый аналог, то есть в шестнадцатеричную строку, аналогично искомое преобразовать в бинарное и в шестнадцатеричную строку, заменить в таком виде и потом обратное преобразование в бинарное. Конечно это будет медленнее работать, но лучше чем ничего.
EnableExplicit Define Path$, Format, Text$ Path$ = OpenFileRequester("Выберите файл", "/home/user/", "Текст (.txt)|*.txt|Все (*.*)|*.*", 0) If Path$ If ReadFile(0, Path$) Format=ReadStringFormat(0) Select Format Case #PB_UTF16BE, #PB_UTF32, #PB_UTF32BE End EndSelect Text$ = ReadString(0, Format | #PB_File_IgnoreEOL) ; читаем файл в строку CloseFile(0) Debug Text$ Text$ = ReplaceString(Text$, "текст" , "_") If OpenFile(0 , Path$, Format) Select Format Case #PB_UTF8, #PB_Unicode WriteStringFormat(0 , Format) EndSelect WriteString(0, Text$, Format) CloseFile(0) EndIf EndIf EndIf
Пример замены строк в бинарном файле: например Grub4Dos имеет в конце файла текстовый конфиг menu.lst. Замену в бинарных автоматически я бы не делал, так как это индивидуальный подход (хотя можно комментарии в картинках удалить от проги создателя или Exif), но вот поиск часто пригождается.
Отредактировано AZJIO (19.02.2021 18:14:49)