Ich habe einige Dateien mit russischen (kyrillischen) Namen.
Wenn ich sie im Windows Explorer öffne, werden die Namen korrekt angezeigt.
Wenn ich sie in der Befehlsshell (cmd) aufliste, werden sie als Zeichen „?????“ angezeigt.
Gibt es eine Möglichkeit, festzustellen, welche Kodierung in den Dateinamen verwendet wird?
Eine der Codeseiten? (Ich habe die gängigen kyrillischen Codeseiten 866 und 1251 mit chcp
dem Befehl ohne Erfolg ausprobiert.) Unicode (Ich habe 65001 ohne Erfolg ausprobiert)? Etwas anderes?
Die Methode der Antwort ist mir nicht besonders wichtig (alles Folgende ist akzeptabel: Freeware-Programm, Perl-Skript, Powershell-Skript, Webseite, die mich zum Hochladen der Datei veranlasst).
System: Windows XP SP3.
Antwort1
Die Dateinamenkodierung wird durch das Dateisystem definiert. NTFS verwendet UTF-16. Das spielt jedoch keine Rolle.
In der Befehlszeile dir
werden Bytes nicht einfach blind kopiert. Es muss zuerst die entsprechende Betriebssystemfunktion aufrufen, um das Verzeichnis aufzulisten, und dann die empfangenen Dateidetails auf der Konsole ausgeben.
Wenn cmd
die Systemfunktion aufgerufen wird, um die Verzeichnisliste abzurufen, erwartet sie bereits, dass sie in der bevorzugten Kodierung zurückgegeben wird (was nicht unbedingt Ihre bevorzugte Kodierung sein muss – mehr dazu später). Es ist egal, welche Kodierung intern im FS verwendet wird, da das Betriebssystem eine zusätzliche Abstraktionsebene zur Vereinfachung bereitstellt. FS kann jede erdenkliche Kodierung verwenden, aber solange das Betriebssystem dies unterstützt, cmd
werden Dateinamen in seiner bevorzugten Kodierung und nicht in der Kodierung des FS empfangen.
Die von mir erwähnte „bevorzugte Kodierung“ ist entweder ANSI mit angewendeter Codepage oder Unicode. ANSI wurde vor Windows 2000 als Standardkodierung verwendet. Windows 2000 und neuere Versionen verwenden standardmäßig Unicode, können aber trotzdem ANSI-Programme ausführen.
Bei Unicode-Programmen wird die Codepage vollständig ignoriert und chcp
hat keine Auswirkung. Sie wird nur für ältere ANSI-Programme verwendet, die auf die richtige Codepage angewiesen sind. Für Unicode spielt sie keine Rolle mehr, da sie wohldefiniert ist und alles unterstützt, was ein vernünftiges Programm ausgeben könnte.
cmd
unterstützt Unicode und empfängt daher Dateinamen, die bereits in Unicode vorliegen.
Wie Sie bereits herausgefunden haben, war der Übeltäter die Standardschriftart. Dieses Problem wird erwähnt aufTechnet-Seite zu chcp:
In einem Eingabeaufforderungsfenster, das Rasterschriftarten verwendet, wird nur die mit Windows XP installierte OEM-Codepage (Original Equipment Manufacturer) korrekt angezeigt. Andere Codepages werden im Vollbildmodus oder in Eingabeaufforderungsfenstern, die TrueType-Schriftarten verwenden, korrekt angezeigt.