Хочу сделать функцию замены текста в файлах используя в будущем поиск файлов. У нас есть разные кодировки, то есть функционал должен определять кодировку, по крайней мере 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)