Orion9

|
Posted: Sat Mar 14, 2026 00:28 Post subject: |
|
|
| AkulaBig wrote: | | Но есть плагин, который лишь иногда крякозябры выводит. Можно ли взять значение из плагина и прогнать его через известную функцию фикса кодировки? |
Теперь понятно о каком плагине была речь.
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: | | И про это писал. Могли-бы они использовать внешние кодеки, можно было-бы покапаться. |
Под внешними кодеками вы имеете в виду переносимые вместе с плеером? Имхо, там любая поддержка должна быть. Автор годами держит проект на плаву. Но я посмотрю завтра, что там в настройках. |
|