Andruk
С англ. не подойдёт, так как они в обоих кодировках будут однобайтовыми. А вот русский да, будет двух-файтовый, а в 1251 однобайтовый. Думаю надо сделать регвыр который выявит все буквы кроме диапазона a-zA-ZА-яЁё или даже вместо a-zA-Z указать весь диапазон от 1 до 127 т.е. \x{01}-\x{7F} как то так
Добавь символы исключения взяв тут
В общем задача получить все символы кроме указанных в массив, а лучше сразу в карту, так убираем дубликаты. Потом сделать замену каждого такого символа на себя с шеснадцатеричным кодом, что-то вроде &#x + Hex(Asc(символ))
Вот новый регвыр
Получил его в AutoIt3 используя код
В AutoIt3 есть ChrW() и Chr(), последняя использует диапазон Win1251, т.е. локальную кодировку языка ОС.
Итак первая версия кода
Код:;- TOP
EnableExplicit
;- # Constants
#RegExp = 0
;- ● Define
Define Text$
Define SourcePath$ = "C:\Users\user\Downloads\1.fb2"
Define DestinationPath$ = "C:\Users\user\Downloads\2.fb2"
Procedure.s ReadFileToVarUTF8(Path$)
Protected id_file, Format, Text$
id_file = ReadFile(#PB_Any, Path$, #PB_UTF8)
If id_file
Text$ = ReadString(id_file, #PB_UTF8 | #PB_File_IgnoreEOL)
CloseFile(id_file)
EndIf
ProcedureReturn Text$
EndProcedure
Procedure.s XML_UTF8_To_Win1251(Text$)
Protected symbolcode, symbol$
Protected pattern$ = "[^А-яЁё\x{01}-\x{7F}ЂЃ‚ѓ„…†‡€‰Љ‹ЊЌЋЏђ‘’“”•–—™љ›њќћџ ЎўЈ¤Ґ¦§©Є«¬®Ї°±Ііґµ¶·№є»јЅѕї]"
Protected NewMap SymbolMap.i()
If CreateRegularExpression(#RegExp, "[^А-яЁё\x{01}-\x{7F}ЂЃ‚ѓ„…†‡€‰Љ‹ЊЌЋЏђ‘’“”•–—™љ›њќћџ ЎўЈ¤Ґ¦§©Є«¬®Ї°±Ііґµ¶·№є»јЅѕї]", 0)
If ExamineRegularExpression(#RegExp, Text$)
While NextRegularExpressionMatch(#RegExp)
If Not FindMapElement(SymbolMap() , RegularExpressionMatchString(#RegExp))
AddMapElement(SymbolMap(), RegularExpressionMatchString(#RegExp), #PB_Map_NoElementCheck)
EndIf
SymbolMap() + 1
Wend
EndIf
; Else
; Debug RegularExpressionError()
EndIf
ForEach SymbolMap()
; Debug MapKey(SymbolMap())
; Debug SymbolMap()
symbol$ = MapKey(SymbolMap())
symbolcode = Asc(symbol$)
; Можно похожие символы заменить на их обычные аналоги, например разного типа пробелы, тире и т.д.
Select symbolcode
Case $2010 ; тире
Text$ = ReplaceString(Text$, symbol$, "-", 1, SymbolMap())
Case $2002 ; пробел широкий как два
Text$ = ReplaceString(Text$, symbol$, " ", 1, SymbolMap())
Case $2003 ; пробел широкий как три
Text$ = ReplaceString(Text$, symbol$, " ", 1, SymbolMap())
Case $2004 To $200B, $202F, $205F ; пробел
Text$ = ReplaceString(Text$, symbol$, " ", 1, SymbolMap())
Default ; стандартная замена для любого символа
Text$ = ReplaceString(Text$, symbol$, "&#x" + Hex(symbolcode) + ";", 1, SymbolMap())
EndSelect
Next
; Кодировку в заголовке XML тоже меняем
Text$ = ReplaceString(Text$, ~"encoding=\"UTF-8\"?>", ~"encoding=\"windows-1251\"?>")
ProcedureReturn Text$
EndProcedure
Procedure.s SaveFileToAscii(Path$, Text$)
Protected id_file
id_file = CreateFile(#PB_Any, Path$)
If id_file
WriteString(id_file, Text$, #PB_Ascii)
CloseFile(id_file)
EndIf
EndProcedure
Text$ = ReadFileToVarUTF8(SourcePath$)
Text$ = XML_UTF8_To_Win1251(Text$)
SaveFileToAscii(DestinationPath$, Text$)
Отредактировано AZJIO (07.11.2025 10:55:54)