Total Commander Forum Index Total Commander
Форум поддержки пользователей Total Commander
Сайты: Все о Total Commander | Totalcmd.net | Ghisler.com | RU.TCKB
 
 RulesRules   SearchSearch   FAQFAQ   MemberlistMemberlist   UsergroupsUsergroups   RegisterRegister 
 ProfileProfile   Log in to check your private messagesLog in to check your private messages   Log inLog in 

Single Post  Topic: Autorun 
Author Message
Orion9



PostPosted: Sat Mar 14, 2026 00:28    Post subject: Reply with quote

AkulaBig wrote:
Но есть плагин, который лишь иногда крякозябры выводит. Можно ли взять значение из плагина и прогнать его через известную функцию фикса кодировки?

AkulaBig wrote:
На нашем сайте все ExifToolWDX https://wincmd.ru/plugring/ExifToolWDX.html

Теперь понятно о каком плагине была речь.

Autorun действительно может вытянуть данные из любого wdx-плагина. Для этого используется объект Plugin
Code:
Func GetExifInfoWdx(FileName)
    Local str
    obj = Plugin("ExifToolWDX")
    If ERROR = 0 Then
       obj.FileName = FileName       
       str = obj.GetValue(215)    # поле "Comment" номер 215 в плагине
       Free(obj)
    Else
       str = "Plugin error " & ERROR
    Endif
    Return str
EndFunc

Функция вернет строку из поля Comment плагина ExifToolWDX. Но если данные хранятся в ANSI, а не в UTF-8, то результатом окажутся заменяющие символы со знаком вопроса, как у вас на картинках. И сделать с этим ничего не получится — так возвращает данные сам плагин ExifToolWDX, автор которого не предусмотрел работу с ANSI.

Остается только выводить данные в консоль и передавать их в Autorun через ProcessExecGetOutput для дальнейшей обработки.

Чем-то это похоже на проблему с кракозябрами в mp3 тегах, только здесь вместо iso-8859 выступает UTF-8. Алгоритм тоже похож: Autorun получает данные в ANSI, делает копию строки в UTF-8, разбивает обе строки на элементы и помещает их в массивы. Далее сравнивает эдементы каждого массива и делает замены при обнаружении символа 0xFFFD.
Code:
RegisterCommand 60045 "ExifInfo"

Func ExifInfo(FileName)
    Local sFile = RequestCopyDataInfo("SP") & RequestCopyDataInfo("SN")
    If Not FileExist(sFile) Then
       ShowHint("Файл не существует " & sFile)
       Return
    EndIf
    MsgBox(GetExifInfo(sFile))
EndFunc

Func GetExifInfo(FileName)
    Static a = List(), u = List(), exif = COMMANDER_PATH & "\Plugins\wlx\ExifToolView\exiftool.exe"
    Local ansi, utf8, wrong = Chr(0xFFFD)
    ProcessExecGetOutput ansi %exif% ' -G -S -lang ru "%FileName%"'
    Local nSize = StrLen(ansi)
    Local buf = Buffer(nSize)
    buf.Zero()
    buf.SetStr(ansi, 0, nSize, "ANSI")
    utf8 = buf.GetStr(0, nSize, "CP:65001")   
    Free(buf)
    a.Count = 0   
    u.Count = 0     
    a.Text = ansi   
    u.Text = utf8
    For i = 0 to u.Count - 1
       If StrPos(u[i], wrong) Then u[i] = a[i]
    Next
    Return u.text   
EndFunc

В результате "выхлоп" корректно отображает и ANSI и UTF-8, если обе кодировки присутствуют в тегах файла.

Надеюсь, это как-то поможет. Непонятно только, что вы хотите делать со всей этой огромной кучей потенциальных полей. Они ведь тоже динамически будут появляться и исчезать в зависимости от типа файлов.
AkulaBig wrote:
И про это писал. Могли-бы они использовать внешние кодеки, можно было-бы покапаться.

Под внешними кодеками вы имеете в виду переносимые вместе с плеером? Имхо, там любая поддержка должна быть. Автор годами держит проект на плаву. Но я посмотрю завтра, что там в настройках.
View user's profile Send private message


Powered by phpBB © 2001, 2005 phpBB Group