Aufnahmesteuerung behandelt Gänsefüßchen nicht korrekt

buers
Junior Member
Beiträge: 26
Registriert: 18 Mär 2021, 10:32

Aufnahmesteuerung behandelt Gänsefüßchen nicht korrekt

Beitrag von buers »

Hallo zusammen,

mein erster Beitrag - und er wird lang ...

Bei der Entwicklung eines Programms zum Starten von Aufnahmen (über Hauppauge Stick bzw. von IPTV Streams mit ffmpeg, vlc, streamlink oder selbstgeschriebenem Programm für MagentaTV) bin ich darüber gestolpert, dass Texte in Beschreibungen unter Windows offenbar nicht korrekt behandelt werden, wenn irgendwo in der Beschreibung Gänsefüßchen " sind. Ohne Gänsefüßchen ist alles ok. Da scheint beim Zusammenbau der Aufrufparameter das Gänsefüßchen einfach nicht richtig behandelt zu werden. Zur Erinnerung, \" wie unter Unix funktioniert unter Windows nicht, da braucht man """ (Ja, 3, kann man leicht mit dem Programm unten im Quelltext prüfen). Vielleicht werden im Quelltext von Anwendungssteuerung 2 verwendet?

Parameter sind so eingestellt:

Code: Alles auswählen

{start_year}{leadingZero(start_month,"2")}{leadingZero(start_day,"2")}{leadingZero(start_hour,"2")}{leadingZero(start_minute,"2")}{clean(channel_name)} {device_username} {device_password} {leadingZero(start_day,"2")}/{leadingZero(start_month,"2")}/{start_year} {leadingZero(start_hour,"2")}:{leadingZero(start_minute,"2")} {length_sec} {channel_name_external} {start_year}{leadingZero(start_month, "2")}{leadingZero(start_day, "2")}_{leadingZero(start_hour,"2")}{leadingZero(start_minute,"2")}_{clean(channel_name)}_{clean(title)} "{channel_name}" "{title}" "{short_info}" "{genre}" "{production_year}" "{Origin}" "{description}" "{Actors}" "{original_title}" "{episode}" "{original_episode}" "{episode_number}" "{url}"
Zum Test gebe ich einfach die Parameter aus mit Nummer. Nummer 15 ist übrigens "description". Beispiel, wo es nicht funktioniert:

Code: Alles auswählen

00:c:\bin\scheduletvwinrec.exe
01:202103191500ZDF
02:xxx
03:xxx
04:19/03/2021
05:15:00
06:4200
07:102
08:20210319_1500_ZDF_Bares_f_r_Rares
09:ZDF
10:Bares für Rares
11:Die Trödel-Show mit Horst Lichter
12:Information/Unterhaltung (Informierende Unterhaltung - Unterhaltung allgemein)
13:2021
14:Deutschland
15:Bares für Rares.
©
16:by
17:ZDF/TV-Browser "
18:
19:
20:
21:
22:
Description wird auseinander gebrochen in mehrere Parameter und verkürzt (vermutlich durch falsches Escape des Quotes)

Gegenbeispiel, keine Gänsefüßchen im Beschreibungstext, funktioniert wie erwartet:

Code: Alles auswählen

00:c:\bin\scheduletvwinrec.exe
01:202103190135arte
02:xxx
03:xxx
04:19/03/2021
05:01:35
06:6300
07:108
08:20210319_0135_arte_Die_Party_ist_vorbei
09:arte
10:Die Party ist vorbei
11:Die 19-jährige Céleste ist drogenabhängig und lebt seit einem Jahr auf der Straße. Bis sie von einem Auto angefahren und nach ihrem Krankenhausaufenthalt in eine Suchtklinik überwiesen wird....
12:Spielfilm
13:2016
14:Frankreich
15:Céleste ist gerade einmal 19 Jahre alt, hat aber schon so ziemlich jede Droge, die es gibt, ausprobiert, um ihrer tristen Realität zu entfliehen. Nachdem sie im Drogenrausch gegen ihre überforderte, alleinerziehende Mutter gewalttätig wird, ist sie abgehauen.Ein Jahr lang lebt Céleste bereits auf der Straße und schlägt sich mehr schlecht als recht durch, bis sie eines Tages von einem Auto angefahren wird. Ihre Verletzungen können im Krankenhaus behandelt werden, doch für ihre Drogensucht muss Céleste in eine Entzugsklinik. Dort trifft sie auf die 26-jährigen Sihem. Die beiden jungen Frauen teilen sich ein Zimmer und durchleben gemeinsam den kalten Entzug.Aber es fällt ihnen schwer, sich auf die strengen Regeln, die Gruppentherapiesitzungen, die Entspannungsübungen und die anderen Patienten in der Klinik einzulassen. Nur zueinander entwickeln sie nach und nach eine immer engere Beziehung, ein tiefes Verständnis und eine innige Freundschaft. Als sie eines nachts aus der Klinik ausbrechen und im nächsten Ort auf einer Hausparty landen, sieht die Klinikleitung darin einen Grund, die beiden vor die Tür zu setzten. Zuerst sieht es so aus, als könnten Céleste und Sihem es trotzdem schaffen, doch dann ziehen sie die Versuchungen von Partys und Drogen immer tiefer in den Abgrund …
© by DasErste/TV-Browser
16:Clémence Boisnard (Céleste), Zita Hanrot (Sihem), Marie Denarnaud (Célestes Mutter), Christine Citti (Catherine), Pascal Rénéric (Jean-Louis), Michel Muller (Psychologe), Inès Fehner (Therapeutin), Martine Schambacher (Madeleine), Lyna Khoudri (Amel), Behi Djanati Ataï
17:La fête est finie
18:
19:
20:
21:Link gelöscht, da ich das nicht darf mit weniger als 5 Beiträgen
Mit folgendem Programm kann man es leicht nachvollziehen, mit C oder C++ Compiler übersezten und eintragen unter Applikation bei Aufnahmesteuerung. Das Programm schreibt nur die Aufrufparameter als UTF8 in die Datei rectester.txt.

Code: Alles auswählen

/* Write Command line arguments to UTF8 text file */
#include <stdio.h>
#include <windows.h>

static const char *BOM_UTF8 = "\xEF\xBB\xBF";

int wmain(int argc, const wchar_t *argv[])
{
  int i;
  FILE *fp;
  char utf8[10000];

  // WideCharToMultiByte doesn't generate terminating 0, when full buffer is used
  utf8[9999] = 0;
  fp = fopen("rectester.txt", "wb");
  if (fp)
  {
    fprintf(fp, "%s", BOM_UTF8);
    for (i = 0; i < argc; i++)
    {
      // Convert to UTF8
      WideCharToMultiByte(CP_UTF8, 0, argv[i], -1, utf8, 9999, NULL, NULL);
      fprintf(fp, "%02d:%s\n", i, utf8);
    }
    fclose(fp);
  }
  return 0;
}
Mir ist durchaus bewusst, dass man sowas grundsätzlich auch (fast) mit Batchprogrammierung hinkriegt. Aber grade die Sonderzeichen, Leerzeichen und das Quoting machte mich schier verrückt. Mit Programm ging dann alles ganz einfach und schnell. Mein Programm funktioniert auch. Will aber die Beschreibung zu der aufgenommenen Sendung mit archivieren. Intention für die Hochsprache war auch, dass je nach Version, Stream, Mondphase es nicht zuverlässig hinzugriegen war, bei ffmpeg und vlc die Aufnahme-Dauer zu limitieren. Lief manchmal einfach weiter. In meinem Programm kann ich den Aufnahme-Prozess (zunächst sanft) beenden oder killen, wenn er zu lange dauert.

Vielleicht hat auch noch jemand einen Tipp, wie man das Problem umgehen kann. Was ich nicht möchte ist auf Sonderzeichen verzichten bei der Beschreibung. (Bei Dateinamen schon).

Aufnahmesteuerung ist Version 3.1.5.3, TV-Browser Version: 4.2.2., Windows 10 Pro

Kenne das Problem aber schon sehr lange für alle von mir die letzten Jahre genutzten Versionen. Hat mich jetzt einfach mal wieder gewurmt und war noch an anderem verwandten Thema dran - da bin ich hier über das Forum gestolpert und dachte mir, dass ich das mal hier adressiere.

Ist Aufnahmesteuerung im Quelltext erhältlich? Wo?
ds10
Site Admin
Beiträge: 19095
Registriert: 23 Jun 2005, 12:36
Kontaktdaten:

Re: Aufnahmesteuerung behandelt Gänsefüßchen nicht korrekt

Beitrag von ds10 »

Die Aufnahmesteuerung behandelt Sonderzeichen exakt gar nicht, denn dafür gibt es die Funktionen clean und cleanLess, die alle Zeichen ersetzen, die potentiell Probleme verursachen könnten.

Den Quellcode des Plugins findest du hier.
"First they ignore you, then they ridicule you, then they fight you, then you win." - Mahatma Gandhi
Unterstütze die Weiterentwicklung von TV-Browser
ds10
Site Admin
Beiträge: 19095
Registriert: 23 Jun 2005, 12:36
Kontaktdaten:

Re: Aufnahmesteuerung behandelt Gänsefüßchen nicht korrekt

Beitrag von ds10 »

Die morgige Nightly von TV-Browser erlaubt spezielle Escape-Sequenzen innerhalb von Strings. Somit wird es möglich die Anführungszeichen beliebig zu ersetzen, z.B. ersetzt folgende Anweisung alle " mit "" innerhalb der Beschreibung:

Code: Alles auswählen

{replace(description,"/"::/"/"")}
"First they ignore you, then they ridicule you, then they fight you, then you win." - Mahatma Gandhi
Unterstütze die Weiterentwicklung von TV-Browser
buers
Junior Member
Beiträge: 26
Registriert: 18 Mär 2021, 10:32

Re: Aufnahmesteuerung behandelt Gänsefüßchen nicht korrekt

Beitrag von buers »

Danke dir!

clean/cleanless kannte ich schon (war auch im Beispiel in meinem Beitrag drin). Ging mir halt darum, den Text korrekt zu kriegen bei Beschreibung. Nach meinen Erfahrungen hat das hervorragende Plugin ja auch keinerlei grundsätzlichen Probleme mit Sonderzeichen. Nur das Quoting in Zusammenhang mit Gänßefüßchen im Beschreibungstext ist problematisch.

Nightly habe ich geprüft. Kriege ich nur so halb hin. Wenn ich alle " durch """ ersetze, wird alles auf der Kommandozeile übergeben, inkl. die Gänsefüßchen kommen so an wie erwartet. "Text der description" wird in einzelne Worte ab dem ersten Gänsefüßchen geschnitten. Sorry für das blöde Beispiel, war halt der kürzeste Eintrag im aktuellen Programm, der Gänsefüßchen in der Beschreibung hat. Sieht es so aus:

Die Sendung Bares für Rares läuft -> "{description}" liefert den Text als ein Kommandozeilen-Argument an die Applikation die aufgerufen wird (vollkommen unproblematischer Fall, Sonderzeichen kein Problem)
Die Sendung "Bares für Rares" läuft -> "{description}" Ich kann nicht ganz folgen was genau passiert, aber wird zerstückelt in mehrere Argumente, und fängt erst dem ersten Gänsefüßchen innerhalb der description an.
Replace probiert, wie von dir vorgeschlagen, mit 2 und 3 Gänsefüßchen. Ist immer bisschen anders, aber will nicht ganz. Mir scheint der Parser kommt jetzt mit "instring-Status" durcheinander (da er die Windows-Konvention ja nicht kennt). "{replace(description,"/"::/"/"/"")}" ist schon korrekt für " -> """ ?

So müsste das Argument aussehen:
"Die Sendung """Bares für Rares""" läuft"

Wenn ich das an ein Programm übergebe, wird das als ein Argument empfangen, wie gewünscht. (Kann man aber mit echo auf der Kommandozeile nicht prüfen, das ist als internes Kommando wieder anders ...) Unter Unix braucht man aber:

"Die Sendung \"Bares für Rares\" läuft"

(Oder Varianten mit Single Quote)
Das funktioniert unter Windows leider nicht. Habe mal in den Quelltext reingeschnuppert. Bin leider Java nicht so gut firm (nur aus Verwandschaft mit C/C++). Ich könnte mir sogar vorstellen, dass unter Unix das sogar geht, wenn man " durch \" ersetzt, weil dann der Parser das als Escape erkennt. Bei Windows geht's so halt leider nicht. Vielleicht kann ich mal unter Linux testen.
Oder sollte " ersetzen durch \"\"\" funktionieren? Nimmt der Parser das Escape dann weg, sieht es nicht als String-Ende/Anfang und gibt das als 3 """ weiter?

Beim Replace-Befehl: das Escape Zeichen ist hier der slash - korrekt? Und Backslash ist nicht speziell? Ist das denn grundsätzlich so, bei der Parameter-Verarbeitung? " durch \"\"\" ersezten wäre dann: "{replace(description,"/"::\/"\/"\/"")} ?

Noch Anmerkung zu Nightly: Einige Parameter funktionieren nicht mehr: {genre}, {origin}, {original_title} und weitere. Ist das zu erwarten? In der Hilfe, die aufpoppt bei der Parameter-Einstellung sind die noch drin.
ds10
Site Admin
Beiträge: 19095
Registriert: 23 Jun 2005, 12:36
Kontaktdaten:

Re: Aufnahmesteuerung behandelt Gänsefüßchen nicht korrekt

Beitrag von ds10 »

Ja der Slash ist schon richtig, der Backslash wird als Escape-Sequenz außerhalb der Strings verwendet, daher konnte der innerhalb nicht benutzt werden, also stattdessen der Slash. Dass einige Parameter nicht funktionieren, ist auf eine andere Änderung zurückzuführen. Du musst einfach nur {XXX_type} angeben, dann werden die wieder gefunden oder warte halt auf die morgige Nightly, damit werden die Parameter wieder funktionieren.

Ich würde ja sagen, man muss nicht mit dem Kopf durch die Wand, wenn es mit Anführungszeichen nicht funktioniert, dann ersetze die doch durch z.B. ' oder ein Leerzeichen (oder ab der morgigen Nightly durch nichts).
"First they ignore you, then they ridicule you, then they fight you, then you win." - Mahatma Gandhi
Unterstütze die Weiterentwicklung von TV-Browser
buers
Junior Member
Beiträge: 26
Registriert: 18 Mär 2021, 10:32

Re: Aufnahmesteuerung behandelt Gänsefüßchen nicht korrekt

Beitrag von buers »

Danke dir sehr!

Code: Alles auswählen

"{replace(description,"/"::“")}"
funktioniert praktisch perfekt. Das ist das Zeichen Unicode U+201C, (linkes) doppeltes Anführungszeichen. Du hast vollkommen recht - ich will da nicht mit dem Kopf durch die Wand. Es geht eigentlich garnicht um das Anführungszeichen, sondern das außen rum. Jetzt erscheint auch der gesamte Text (vorher hatte TV-Browser immer was verschluckt, nehme an durch den Instring-Status, der nicht mehr passte bei String in String). Wird nun auch alles schön als ein (1) einziges Argument übergeben.

Es scheint, du bist der / einer der Entwickler? (Sorry, bin neu hier ...)
Vielleicht magst du dir trotzdem nochmal überlegen, ob das Quoting innerhalb von (Beschreibungs-)Text nicht "korrekter" gemacht werden kann. Für mich persönlich aber kein Thema mehr, da die Lösung geht. (Selbst kenne ich das aber auch zu Genüge von eigenen Tools, PITA ...) Aber anzunehmen, dass jeder, der "schöne" {description} nutzen will ohne clean, darüber stolpern muss. (Nicht gleich, weil die meisten Beschreibungen kein Quote nutzen).
ds10
Site Admin
Beiträge: 19095
Registriert: 23 Jun 2005, 12:36
Kontaktdaten:

Re: Aufnahmesteuerung behandelt Gänsefüßchen nicht korrekt

Beitrag von ds10 »

Das lässt sich halt schlecht automatisch machen, denn das Parameter-System gilt für TV-Browser als Ganzes, d.h. man kann nicht einfach die Anführungszeichen mit einer Escape-Squenz ersetzen, da man nicht sicher sein kann, dass das an der Stelle erwünscht ist. Daher habe ich jetzt eine Funktion escapeQuotes hinzugefügt, die bei Bedarf die Anführungszeichen ersetzt.

Dass die Escape-Sequenz nicht funktioniert hat, lag nicht an der Aufnahmesteuerung, sondern beim Starten von externen Programmen, dort wurde das nicht beachtet, sondern jedes Anführungszeichen für den Anfang/das Ende eines Parameters interpretiert.

Ab der morgigen Nightly sollte es also mit escapeQuotes korrekt funktionieren.
"First they ignore you, then they ridicule you, then they fight you, then you win." - Mahatma Gandhi
Unterstütze die Weiterentwicklung von TV-Browser
ds10
Site Admin
Beiträge: 19095
Registriert: 23 Jun 2005, 12:36
Kontaktdaten:

Re: Aufnahmesteuerung behandelt Gänsefüßchen nicht korrekt

Beitrag von ds10 »

Ich habe jetzt noch einige Tests unter Windows gemacht, als Ergebnis steht fest, dass man die Anführungszeichen an z.B. VBScript nicht weiter geben kann, escapeQuotes sorgt dafür dass TV-Browser-intern die Parameter korrekt ermittelt werden. Das interessiert VBScript aber dann doch nicht oder man muss irgendwie noch mehr Anführungszeichen einbauen, man kann aber mit replace("%"::%"%"") erreichen, dass die im Text vorhandenen Anführungszeichen von VBScript ignoriert werden und somit der gesamte Text als ein Parameter ankommt, aber eben ohne Anführungszeichen.

Ab der morgigen Nightly ändert sich das Escape-Zeichen für Escape-Sequenzen in Strings von Funktionen von / zu %, da / für die Verzeichnisse unter unixoiden Betriebsysystemen benötigt wird.
"First they ignore you, then they ridicule you, then they fight you, then you win." - Mahatma Gandhi
Unterstütze die Weiterentwicklung von TV-Browser
buers
Junior Member
Beiträge: 26
Registriert: 18 Mär 2021, 10:32

Re: Aufnahmesteuerung behandelt Gänsefüßchen nicht korrekt

Beitrag von buers »

Wie hast du denn das Escape gemacht? vbscript kenne ich mich nicht aus. Sorry, falls ich dich mit den 3 Quotes auf die falsche Spur gebracht habe. Für C/C++ Programme habe ich probiert: Standard C Funktion system() (ruft mit dem übergebenen String cmd.exe /c auf) und die Windows-API Funktion CreateProcess. Verhalten sich diesbezüglich identisch. Habe jeweils aufgerufen ein Programm, das nur die übergebenen Argumente ausgibt.

Code: Alles auswählen

echoarg a b c
echoarg "a b c"
echoarg "a ""b"" c"
echoarg "a """b""" c"
echoarg "a \"b\" c"
echoarg a \"b\" c
Ausgabe

Code: Alles auswählen

Calling echoarg a b c
Arg 0 Start:echoarg:End
Arg 1 Start:a:End
Arg 2 Start:b:End
Arg 3 Start:c:End
Calling echoarg "a b c"
Arg 0 Start:echoarg:End
Arg 1 Start:a b c:End
Calling echoarg "a ""b"" c"
Arg 0 Start:echoarg:End
Arg 1 Start:a "b:End
Arg 2 Start:c:End
Calling echoarg "a """b""" c"
Arg 0 Start:echoarg:End
Arg 1 Start:a "b" c:End
Calling echoarg "a \"b\" c"
Arg 0 Start:echoarg:End
Arg 1 Start:a "b" c:End
Calling echoarg a \"b\" c
Arg 0 Start:echoarg:End
Arg 1 Start:a:End
Arg 2 Start:"b":End
Arg 3 Start:c:End
Es funktioniert hier also auch \" neben """. Ich erinnere mich aber, dass ich früher mal zu dem Schluss kam, dass die 3 Quotes zu bevorzugen sind. Kann das aber nicht mehr nachvollziehen. Sorry. Vielleicht war das beim Mischen von batch und Programmen. Meine Projekte sind normalerweise auch (möglichst) OS-unabhängig. Da wollte ich das bestimmt nicht freiwillig machen. (Mein Beispielprogramm mit den fürchterlichen Windows-Spezifika am Anfang war einfach, weil ich sonst keine Möglichkeit sehe, wirklich Sonderzeichen hinzukriegen unter Windows. Parameterübergabe in einfachen chars und UTF8 funktioniert halt nicht unter Windows wie unter Linux).

Kann deine Argumente nachvollziehen, dass man das im Nachhinein nicht leicht hinkriegt. Liegt auch bisschen daran, dass Quotes anders als Klammern halt nicht schachteln. 4 Quote Zeichen können halt auf 2 Arten interpretiert werden.
buers
Junior Member
Beiträge: 26
Registriert: 18 Mär 2021, 10:32

Re: Aufnahmesteuerung behandelt Gänsefüßchen nicht korrekt

Beitrag von buers »

Kurze Rückmeldung noch zur Nightly von heute - die Parameter wie genre gehen wieder, danke!
Eine Kleinigkeit noch, mit {url} sehe ich sonst oft einen omdb Link. Probiere ich ZDF, 31.03. 15:05 Bares für Rares (weil ich halt weiß, dass da immer die Gänsefüßchen sind), kommt für die URL "März" - hmm? Habe aber jetzt nicht weiter getestet.
ds10
Site Admin
Beiträge: 19095
Registriert: 23 Jun 2005, 12:36
Kontaktdaten:

Re: Aufnahmesteuerung behandelt Gänsefüßchen nicht korrekt

Beitrag von ds10 »

Okay, wenn ich es mit einem Programm anstatt WScript probiere, bekomme ich die Anführungszeichen auch übergeben. Also reicht ab morgen einfach "{escapeQuotes(description)}" um die Anführungszeichen korrekt übergeben zu bekommen.
"First they ignore you, then they ridicule you, then they fight you, then you win." - Mahatma Gandhi
Unterstütze die Weiterentwicklung von TV-Browser
buers
Junior Member
Beiträge: 26
Registriert: 18 Mär 2021, 10:32

Re: Aufnahmesteuerung behandelt Gänsefüßchen nicht korrekt

Beitrag von buers »

Die Replace Methode funktioniert bei mir mit jetzt mit % als Escape, wie von dir angekündigt.
EscapeQuotes funktioniert nicht korrekt bei mir. Test wiederum Bares für Rares, 22.03. ZDF 15:05. Für EscapeQuotes der Description kommen 5 Argumente an:

Code: Alles auswählen

1:Wertvoll oder wertlos? Ob alter Krimskrams oder edle Rarität: In Horst Lichters Trödel-Show kann jeder seltene Fundstücke aus Keller oder Garage schätzen lassen.

Die Geschichte der Kuriositäten, viele Schätze und noch mehr Raritäten, hammerhartes Verhandeln mit Lachen, Tränen und manchen Überraschungen - das alles bietet Horst Lichter in "Bares
2:für
3:Rares.
©
4:by
5:ZDF/TV-Browser
Erwarten würde ich ein Argument:

Code: Alles auswählen

Wertvoll oder wertlos? Ob alter Krimskrams oder edle Rarität: In Horst Lichters Trödel-Show kann jeder seltene Fundstücke aus Keller oder Garage schätzen lassen.

Die Geschichte der Kuriositäten, viele Schätze und noch mehr Raritäten, hammerhartes Verhandeln mit Lachen, Tränen und manchen Überraschungen - das alles bietet Horst Lichter in "Bares für Rares".
© by ZDF/TV-Browser
Mein Aufnahme-Scheduler meldet einen Fehler zurück (Ursache kommt gleich). TVB nennt mir dann "Gesendete Parameter":

Code: Alles auswählen

202103221500ZDF computer\user *** 22/03/2021 15:00 4200 102 20210322_1500_ZDF_Bares_f_r_Rares "ZDF" "Bares für Rares" "Die Trödel-Show mit Horst Lichter" "Information/Unterhaltung (Informierende Unterhaltung - Unterhaltung allgemein)" "2021" "Deutschland" "Wertvoll oder wertlos? Ob alter Krimskrams oder edle Rarität: In Horst Lichters Trödel-Show kann jeder seltene Fundstücke aus Keller oder Garage schätzen lassen.

Die Geschichte der Kuriositäten, viele Schätze und noch mehr Raritäten, hammerhartes Verhandeln mit Lachen, Tränen und manchen Überraschungen - das alles bietet Horst Lichter in \"\"Bares für Rares\"\".
© by ZDF/TV-Browser" "" "" "" "" "" "" 
Das doppelte \"\" funktioniert offensichtlich nicht. Probiere das später nochmals mit meinem Testprogramm. Zusätzlich scheint ein neues Verhalten da, bei Übergabe des Usernamens. Windows-typisch ist der "computer\user" (und so auch in den Einstellungen von Aufnahmesteuerung konfiguriert. Der Fehleroutput von TVB sagt auch exakt das. Aber ankommen tut "computeruser", der Backslash ist verschluckt. Gestern ging das noch anders. Oder habe ich das was übersehen?

Ergänzung: Habe nochmal mit Nightly von gestern gegengeprüft: Da wurde der Backslash beim Benutzer noch nicht verschluckt. Das kuriose "März" für URL ist dafür beim heutigen Nighly verschwunden, war gestern drin.
ds10
Site Admin
Beiträge: 19095
Registriert: 23 Jun 2005, 12:36
Kontaktdaten:

Re: Aufnahmesteuerung behandelt Gänsefüßchen nicht korrekt

Beitrag von ds10 »

Ich habe hier ein Testskript von Autohotkey und dort wird wie erwartet "{escapeQuotes(description)}" als ein Parameter ausgegeben. Das mit computer\benutzer hätte eigentlich vorher schon nicht funktionieren sollen, denn um einen Backslash auszugeben, muss man vier Backslashes eintragen, da der Backslash ja auch als Escape-Zeichen dient (und zwar doppelt, einmal Java-spezifisch, um einen Backslash zu schreibeneinmal für die Parameter und dann noch einmal für den Aufbau der Kommandozeile), also computer\\\\benutzer ergibt als Parameter, der an das System übergeben wird, dann computer\benutzer. Zuvor mit der offiziellen Beta-Version waren es aber noch zwei Backslashes die ausgereicht haben. Mit escapeQuotes wird unter Windows "" für einzelne Anführungszeichen im Text an das System übergeben.

Man sieht ja auch, dass die Trennung der Parameter bei deiner ersten Ausgabe an einer völlig unerwarteten Stelle passiert, nämlich nicht etwa beim ersten auftreten des Anfrühungszeichens, sondern erst beim nächsten Leerzeichen. Möglicherweise würde das Aufnahmeprogramm auch einfach \" erwarten, das funktioniert mit Autohotkey beim Test auch. Ich hatte nur "" genommen, weil das früher typisch für Windows war oder es braucht noch eine weitere Einrahmung mit Anführungszeichen "\\"{escapeQuotes(description)}\\""
parameter1.png
parameter1.png (11.12 KiB) 6321 mal betrachtet
parameter2.png
parameter2.png (17.74 KiB) 6321 mal betrachtet
übergabe.png
übergabe.png (22.02 KiB) 6321 mal betrachtet
Es spielt hier keine Rolle, ob man noch die zusätzlichen Anführungszeichen vor und nach {escapeQuotes(description)} verwendet oder nicht, es wir immer als nur ein Parameter übergeben und vom Skript auch so akzeptiert.

EDIT:
Du könntest es mit "{replace(description,"%"::%\%\%\%"")}" probieren, das entspricht dann \" in der Übergabe an das zu startende Programm und zusätzlich vielleicht noch mit den einrahmenden Anführungszeichen: "\\"{replace(description,"%"::%\%\%\%"")}\\"". Im Prinzip kannst du mit replace alle denkbaren Varianten durchspielen, denn escapeQuotes macht ja auch nichts anderes, als die Anführungszeichen mit Escape-Sequenzen zu ersetzen. Vor einem Anführungszeichen, das als Text übergeben werden soll, muss aber in jeden Fall ein Backslash stehen, damit TV-Browser das nicht als neuen Parameter interpretiert.

Das Einzige was ich an escapeQuotes jetzt noch ändern könnte wäre statt "" auch bei Windows \" für Text-Anführungszeichen zu verwenden.
"First they ignore you, then they ridicule you, then they fight you, then you win." - Mahatma Gandhi
Unterstütze die Weiterentwicklung von TV-Browser
buers
Junior Member
Beiträge: 26
Registriert: 18 Mär 2021, 10:32

Re: Aufnahmesteuerung behandelt Gänsefüßchen nicht korrekt

Beitrag von buers »

Zwei Anführungszeichen funktionieren nicht, ich hatte Beispiele genannt. Auch Google bestätigt das. Zwei Anführungszeichen funktionieren in csv (z.B. mit Excel). Vielleicht kommt daher die Verwechslung.
Autohotkey verstehe ich jetzt nicht, was du damit meinst. Hast du die Ausgabe gekriegt für einfaches

Code: Alles auswählen

"{escapeQuotes(description)} "
. Verstehe jetzt nicht, wie das dort so ankommen kann. Allerdings weiß ich natürlich auch nicht, was Java wirklich macht (habe einen Teil vom TVB Code angesehen).

Wenn ich mit meinen trivialen Testprogrammen probiere:

Code: Alles auswählen

"a \"\"b\"\" c"
Calling echoarg "a \"\"b\"\" c"
Arg 0 Start:echoarg:End
Arg 1 Start:a ""b"" c:End
Das ist vollkommen erwartungsgemäß. 1 Argument, doppelte Quotes. In deinen Beispielen ist mir nicht immer klar, ob da noch Java Escapes mit dargestellt werden. Bei meinen Beispielen gebe ich den "User-String" aus. In C-Quelltext muss vor jeden Backslash ein weiterer, vor jedes Gänsefüßchen (im User-String) auch ein Backslash.

Übrigens wirkt es bei mir so, als wäre (letztlich and die Windows-Api) folgender String weitergegeben worden, von TVB:

Code: Alles auswählen

Calling echoarg "a ""b"" c"
Arg 0 Start:echoarg:End
Arg 1 Start:a "b:End
Arg 2 Start:c:End
Wie das Autohotkey wieder zusammengesetzt kriegt, ist mir ein Rätsel. Und natürlich ist es nicht leicht nachvollziehbar, was da draus gemacht wird. Windows halt ... Aber das kann man so wirklich vielerorts nachlesen, kommt nicht nur von mir.

Das mit den 4 Backslashes verstehe ich durchaus einigermaßen. (Ich hatte mal sed-Skripte geschrieben, die Backslash Quote ersetzen musste, die Backslashes, die man da braucht, kann man nicht mehr zählen .... Die Shell nimmt welche weg, und sed natürlich auch und dann wird jeweils für das Quote Zeichen noch ein zusätzlicher gebraucht). An dieser Stelle von TVB (das ist ja eigentlich schon ein User-Interface, wenn man den Einstellungsdialog ansieht) ist es für mich überraschend. Da würde ich einfach erwarten, dass das Programm das macht, was immer notwendig ist, um genau den String den ich eingebe, weiterzugeben. Bei Sonderzeichen im Passwort muss man das dann vermutlich auch so machen. Aber klar, ich mache nicht die Regeln. War halt gestern noch anders. Ich habe einige Tools geschrieben für csv. Da hatte ich es immer so gemacht. User gibt ein, für Zelle xy.

Code: Alles auswählen

Das gibt der User ein, und es enthält "zitierten Text" und mehr, \ macht hier kein Problem und benötigt kein Escape
Daraus macht dann mein Programm transparent für den User

Code: Alles auswählen

"Das gibt der User ein, und es enthält ""zitierten Text"" und mehr, \ macht hier kein Problem und benötigt kein Escape"
(Hier geht es wie gesagt mit doppelten Gänsefüßchen. https://tools.ietf.org/html/rfc4180)

Ist nicht mein Programm. Und das Programm ist toll - also bitte nicht falsch verstehen. Mir ist auch klar, dass ich hier nicht die Regeln mache. Aber so wird es für Nutzer schon schwierig. Das braucht dann wirklich exakte Doku (die ich natürlich gewollt bin, zu befolgen)
ds10
Site Admin
Beiträge: 19095
Registriert: 23 Jun 2005, 12:36
Kontaktdaten:

Re: Aufnahmesteuerung behandelt Gänsefüßchen nicht korrekt

Beitrag von ds10 »

Einfach ein simples Beispiel, nehmen wir an im Text bei description steht a "b" c, im Aufnehmen-Feld der Aufnahmesteuerung steht "{escapeQuotes(description)}" die Ausgabe der Aufnahmesteuerung für die übergebenen Parameter lautet dann "a \"\"b\"\" c". Die Backslashes dienen dem Programmstarter von TV-Browser als Escape-Sequenz, um die Anführungszeichen nicht als Trenner von Parametern wahrzunehmen. Also Backslash erkannt->nächstes Zeichen in Parameter übernehmen. Das war bisher nicht so, daher jetzt die vier Backslashes, auch die zwei die man vorher brauchte waren schon nicht so schön, aber der Backslash diente halt bisher schon als Escape-Sequenz innerhalb der Parameter. Anstelle der vier Backslashes kann man aber auch einfach jeweils einen Slash nehmen, wenn es sich um Pfadangaben handelt. Beim Rechnernamen geht das aber vermutlich nicht.

Im Ergebnis erkennt TV-Browser "a \"\"b\"\" c" als einen Parameter und übergibt diesen dann auch explizit als einen Parameter an das System und zwar als a ""b"" c, die äußeren Anführungszeichen werden entfernt. Weil es explizit als ein Parameter übergeben wird reichen dann für das Autohotkey-Skript die zwei Anführungszeichen, da ja die äußeren fehlen. Würde man hier drei Anführungszeichen übergeben, dann würde es nicht funktionieren.

Welche Funktion von Java im Hintergrund beim Starten von Programmen auch immer aufgerufen wird, dieser werden die Parameter explizit als einzelne Parameter übergeben, daher auch keine äußeren Anführungszeichen.

Wie gesagt, mit Hilfe von replace kannst du testen, ob es mit drei Anführungszeichen plus äußeren Anführungszeichen funktioniert, wenn du das Aufnahmeprogramm aufrufst "\\"{replace(description,"%"::%\%"%\%"%\%"")}\\"", ich vermute aber das es dann nicht funktioniert, denn Autohotkey interpretiert das dann als einzelne Parameter ab dem ersten Anführungszeichen im Text. Probiere außerdem "{replace(description,"%"::%\%\%\%"")}", wenn ich weiß, dass \" als Escape-Sequenz auch bei deinem Aufnahmeprogramm funktioniert, dann kann ich replaceQuotes entsprechend ändern, denn dann dürfte es bei anderen auch funktionieren, denn bei Autohotkey geht es so auch. Bevor ich nicht weiß, was bei deinem Aufnahmeprogramm funktioniert bzw. ob es überhaupt funktioniert, kann ich auch keine Anleitung schreiben, denn es ist ja alles noch in Entwicklung.

Möglicherweise kommt einfach das Aufnahmeprogramm mit Anführungszeichen nicht klar und sucht die Kommandozeile einfach stur nach Anführungszeichen ab.

Letztendlich ist das auch genau der Grund, warum sich die Aufnahmesteuerung standardmäßig nicht um solche Dinge kümmert, jedes Programm kann es anders handhaben und es gibt keine Garantie, dass es auf eine bestimmte Weise funktioniert.

Hier das Autohotkey-Skript, das lässt sich zur EXE kompilieren, wenn Autohotkey installiert ist:

Code: Alles auswählen

#NoEnv  ; Recommended for performance and compatibility with future AutoHotkey releases.
; #Warn  ; Enable warnings to assist with detecting common errors.
SendMode Input  ; Recommended for new scripts due to its superior speed and reliability.
SetWorkingDir %A_ScriptDir%  ; Ensures a consistent starting directory.

Loop, %0%  ; For each parameter:
{
    param := %A_Index%  ; Fetch the contents of the variable whose name is contained in A_Index.
    MsgBox, 4,, Parameter number %A_Index% is %param%.  Continue?
    IfMsgBox, No
        break
}
Dass mit dem Passwort stimmt, war auch bisher schon so, wenn da ein Backslash drin vorkam und mit Anführungszeichen im Passwort ging es bisher gar nicht. An sich ist es auch keine schöne Lösung das Passwort im Klartext über die Kommandozeile zu schicken. Wenn sich mit escapeQuotes eine funktionierende Lösung ergibt, kann man die aber beim Passwort mit Anführungszeichen auch verwenden, nur beim Backslash bliebe das Problem.

Die Aufnahmesteuerung richtet sich jedenfalls eher an Poweruser, da sehr komplex, allein mit den Einstellungen sind viele schon überfordert und sie wurde auch nicht von mir programmiert, sondern ist mir nur in den Schoß gefallen, weil alle anderen Entwickler von TV-Browser vor über 10 Jahren schon abgesprungen sind.

EDIT: Ich habe hier außerdem ein kleines Java-Tool geschrieben, was auch die Parameter mit Nummer ausgeben kann. Da muss man als zu startendes Programm die java.exe auswählen und als Parameter -jar "LAUFWERK:/PFAD/ParameterPrinter.jar" "{escapeQuotes(description)}" Auch damit funktioniert es sowohl mit zwei Anführungszeichen, als auch mit Backslash und einem Anführungszeichen.
Dateianhänge
ParameterPrinter.jar
(886 Bytes) 255-mal heruntergeladen
"First they ignore you, then they ridicule you, then they fight you, then you win." - Mahatma Gandhi
Unterstütze die Weiterentwicklung von TV-Browser
Antworten