cmd.exe und UTF-8-BOM

German support forum

Moderators: Hacker, Stefan2, white

Post Reply
User avatar
milo1012
Power Member
Power Member
Posts: 1158
Joined: 2012-02-02, 19:23 UTC

cmd.exe und UTF-8-BOM

Post by *milo1012 »

Zwar habe ich mich lange gesträubt Arbeitsaufgaben mit der cmd.exe, also .bat/.cmd-Dateien zu erledigen, aber jetzt lerne ich die Nützlichkeit kennen nachdem ich diesen Thread und das darin vorgeschlagene Skript zum Einsatz gebracht habe.
Ich möchte im Prinzip das gleiche machen, in meinem Fall aus mkv-Dateien (Matroska) die Tonspur mittels mkvextract extrahieren, so dass aus einer markierten Datei "video007.mkv" dann z.B. "video007.mkv track1.ogg" wird.
Das Skript rufe ich wie gehabt mit "%F "%P"" auf.
So weit so gut, nur gibt es das alte Problem dass deutsche Umlaute bzw. alle nicht der System-Codepage entsprechenden ANSI-Zeichen Müll produzieren. Die cmd.exe ist idiotischerweise immer noch ASCII/OEM-bezogen, was in diesem Fall alles andere als nützlich ist.
Ich habe jetzt drei Möglichkeiten ausgemacht:

1. %d im TC-Aufruf nehmen - schön und gut, ich will aber lange Dateinamen behalten
2. %F behalten und die erzeugte Listendatei in der ersten Zeile des Skripts in ASCII/OEM konvertieren. Ein kleines aber feines Programm dafür wäre z.B. txtcnv32. Klappt im Prinzip mit deutschen Umlauten, aber bei fremdem System-Zeichensatz bzw. exotischen Zeichen im Dateinamen dürfte das mit Sicherheit wieder Probleme geben. Deshalb:
3. Die wahrscheinlich sinnvollste Möglichkeit wäre UTF-8. Ich kann die cmd.exe UTF-8-fähig machen indem ich chcp 65001 benutzte, dafür benutze ich dann als Aufruf "%UF "%P"".

Würde klappen, nur leider stört in dem Fall die BOM die TC ausgibt, die erste Datei wird dann immer ignoriert.
Ich habe mir jetzt selber ein Programm kompiliert das die BOM entfernt wenn sie gefunden wird, dann ist alles wunderbar.

Deshalb die Frage:
Gibt es eine Möglichkeit TC zum weglassen der BOM bei einer Listendatei zu überreden? Wenn nein würde ich direkt den Antrag stellen diese Option in einer der nächsten Versionen hinzuzufügen ;)
Bis dahin, kennt vielleicht jemand ein kleines Tool um die BOM manuell zu entfernen. Mein Programm funktioniert zwar, bleibt aber trotzdem eine Flickenlösung. Ich kenne zwar libiconv, bekomme es aber einfach nicht für meine Zwecke zum laufen uns ist viel zu kompliziert zu steuern.

Hier noch mein Code:

Code: Select all

@echo off
 chcp 65001
 ansi2utf8.exe "%~1" -bom
 if -%2==- echo First parameter must be filelist path, second source path. && pause && goto :EOF
 for /F "usebackq delims=" %%f in ("%~1") do (
    "D:\tools\mkvtools\mkvextract.exe" tracks "%~2%%f" 2:"%~2%%f track1.ogg"
 )
 pause
 cls
User avatar
Dalai
Power Member
Power Member
Posts: 9960
Joined: 2005-01-28, 22:17 UTC
Location: Meiningen (Südthüringen)

Re: cmd.exe und UTF-8-BOM

Post by *Dalai »

milo1012 wrote:Deshalb die Frage:
Gibt es eine Möglichkeit TC zum weglassen der BOM bei einer Listendatei zu überreden?
Ja: cm_SaveSelectionToFileA. Siehe auch totalcmd.inc in %COMMANDER_PATH%.

Davon abgesehen brauchst du chcp zwar auf einer CMD zum Verarzten der Umlaute, aber nur zum Umstellen auf die entsprechende "active codepage" (ACP), aber kein UTF-8. Für konkrete Ermittlung & Benutzung siehe diesen Beitrag/Thread.

MfG Dalai
#101164 Personal licence
Ryzen 5 2600, 16 GiB RAM, ASUS Prime X370-A, Win7 x64

Plugins: Services2, Startups, CertificateInfo, SignatureInfo, LineBreakInfo - Download-Mirror
User avatar
Dalai
Power Member
Power Member
Posts: 9960
Joined: 2005-01-28, 22:17 UTC
Location: Meiningen (Südthüringen)

Post by *Dalai »

Übrigens: wenn man %L als Platzhalter/Parameter eines Buttons/Startermenü-Eintrags verwendet, wird die Listendatei ebenfalls nicht als Unicode-Datei erstellt. Ggf. lässt es sich damit leichter arbeiten, als erst einen separaten Befehl zu verwenden und dann das Skript darauf loszulassen.

MfG Dalai
#101164 Personal licence
Ryzen 5 2600, 16 GiB RAM, ASUS Prime X370-A, Win7 x64

Plugins: Services2, Startups, CertificateInfo, SignatureInfo, LineBreakInfo - Download-Mirror
User avatar
milo1012
Power Member
Power Member
Posts: 1158
Joined: 2012-02-02, 19:23 UTC

Post by *milo1012 »

Erstmal danke für die Antwort, nur verstehe ich nicht ganz was daran jetzt eine Lösung sein soll.
Dein verlinkter Thread zeigt doch nichts anderes als was ich mit txtcnv32 gemeint habe, nur als Skript direkt in der cmd.exe-Instanz.
Was nützt mir jetzt cm_SaveSelectionToFileA? Ich habe einen Dialog um meine Dateinamen zu speichern. Ich möchte aber wie erwähnt einen Button haben der das Skript verlinkt und die Listendatei übergibt.
Davon abgesehen brauchst du chcp zwar auf einer CMD zum Verarzten der Umlaute, aber nur zum Umstellen auf die entsprechende "active codepage" (ACP), aber kein UTF-8. Für konkrete Ermittlung & Benutzung siehe diesen Beitrag/Thread.
Nochmal: Was nützt es mir wenn ich in meinen Dateinamen Zeichen habe die sich weder in ANSI noch in ASCII Umwandeln lassen, beispielsweise 蠢货电影. Mit chcp 65001 kann ich die cmd.exe Unicode-fähig machen, halt nicht UTF-16 sondern die von Microsoft zuerst benutzte aber jetzt stiefmütterlich behandelte MBCS-Variante UTF-8. Wenn ich chcp 1200 nutzen könnte wäre ja alles in Butter, geht aber halt nicht.
Klar, mit deutschen Umlauten kann ich ANSI->ASCII-Konvertierungen nutzen, aber ich wollte eine universelle Lösung für alle Dateinamen haben und die von mir benutzte Variante funktioniert doch völlig problemlos. Mein einziges Problem war die ByteOrderMark (BOM) die stört, weil sie den ersten übergebenen Dateinamen runiniert. Ich habe schon versucht mit einem weiteren Delimiter zu arbeiten, aber kein Erfolg, ich müsste halt die Bytesequenz "EF BB BF" filtern, geht aber nicht.

Deswegen die Frage ob es möglich wäre eine Variante ohne BOM einzubauen. Bein UTF-16 hat die BOM ihren Sinn, bei UTF-8 eigentlich nicht wirklich, Sie zeigt nur direkt am Anfang an was codiert ist. Nur erkennt jedes "moderne" Textverarbeitungsprogramm (Notepad++, Notepad2 und Konsorten und auch der Total-Commander-Lister) sowieso beim Parsen ob UTF-8-codierte Zeichen überhaupt vorhanden sind. Sind nur alte ASCII-Zeichen <=127 drin ist die Datei sowieso binäridentisch zu einer reinen ASCII-Datei.
User avatar
Dalai
Power Member
Power Member
Posts: 9960
Joined: 2005-01-28, 22:17 UTC
Location: Meiningen (Südthüringen)

Post by *Dalai »

Sorry, ich hatte deine Eingangsfrage wohl etwas zu oberflächlich gelesen.

Ich glaube, bei Unicode ist die CMD so ziemlich die schlechteste Wahl. Es gibt andere Skriptsprachen, die ähnlich einfach (und dabei noch leistungsfähiger) sind, aber keine Probleme mit Unicode oder einem BOM haben: z.B. AutoIt und wahrscheinlich auch AutoHotkey und VBS.

Nichtsdestotrotz habe ich nichts dagegen, wenn TC eine Option bekommt, eine Dateiliste ohne BOM zu speichern. Nur glaube ich nicht, dass das in absehbarer Zeit eingebaut wird, denn dafür gibt es wichtigere Baustellen. Insofern kann es nicht schaden, wenn du dir die genannten Sprachen mal anschaust; für alle davon gibt es hier im Forum (funktionierende) Beispiele mit diversen Schleifen und ähnlichem, woran man sich orientieren kann.

MfG Dalai
#101164 Personal licence
Ryzen 5 2600, 16 GiB RAM, ASUS Prime X370-A, Win7 x64

Plugins: Services2, Startups, CertificateInfo, SignatureInfo, LineBreakInfo - Download-Mirror
Post Reply