Der Martin: Welche Zeichencodierung unter Windows ?

Beitrag lesen

Hallo,

danke für deine Hilfe und Ausführung.

... die wohl völlig an der Frage vorbeiging, weil ich dich einfach missverstanden hatte.

Eine Datei wird unter Windows XP (Deutsch) mit dem Namen sÄÜ.txt einmal im UTF8 Format und einmal als ANSI gespeichert.

Es geht dir also um den *Dateinamen*, nicht den Dateiinhalt. Das hatte ich gestern abend nicht verstanden. Auf die Idee, den Dateinamen zu betrachten, bin ich gar nicht gekommen, weil der völlig unabhängig davon ist, ob du eine Textdatei als "ANSI" oder "UTF-8" speicherst - das bezieht sich nämlich nur auf die Codierung des *Dateiinhalts*.

Windows speichert Dateinamen intern immer in UCS-2, einer einfachen Variante von UTF-16. Es gibt allerdings verschiedene System-APIs, mit denen man auf das Dateisystem zugreifen kann. Es gibt Funktionen, die Namen als UCS-2 übergeben, und es gibt solche, die nur 1 Byte pro Zeichen verwenden. Windows verwendet dabei Windows-1252, d.h. die Codes 0x80..0x9F werden auch als gültige Zeichen verwendet.

PHP benutzt unter Windows offensichtlich die 1-Byte-Funktionen. Windows muss also an der API-Schnittstelle von UCS-2 (2 Byte pro Zeichen, intern) nach Windows-1252 (1 Byte pro Zeichen) umcodieren. Dabei werden Zeichen, die in Windows-1252 nicht darstellbar sind, einfach in Fragezeichen '?' umgewandelt.[1]

PHP reagiert wiederum unterschiedlich, je nachdem, mit welcher PHP-Funktion man den Verzeichnisinhalt abfragt. Während readdir() die Namen wie beschrieben (Fragezeichen für nicht darstellbare Zeichen) durchreicht, filtert glob() Namen, die solche Zeichen enthalten, einfach aus. Sie scheinen nicht zu existieren.

Diesen Codeschnipsel habe ich übrigens zum Testen verwendet:

<table>  
<?php  
  
// use either of the following pair of instructions:  
//  * glob() with a foreach() loop  
// or  
//  * opendir() with a while() loop  
  
//$names = glob("*.*");  
//foreach ($names as $file)  
$dir = opendir(".");  
while (false!==($file=readdir($dir)))  
 { echo "<tr><td>$file</td><td>";            // file name as text  
   for ($i=0; $i<strlen($file); $i++)        //  
    { printf(" %02X", ord($file[$i]));       // file name as hex dump  
    }  
   echo "</td></tr>\n";                      // end of table row  
 }  
?>  
</table>

Er gibt mir die Liste aller Dateien im Verzeichnis einmal als Klartext aus, und daneben als Hexdump. So konnte ich leicht erkennen, welche Zeichencodes wirklich darin vorkommen.

Mir geht es eigentlich nicht so sehr um den Inhalt der Datei sondern was wie Windows diese Datei mit Sonderzeichen bzw. Umlaute behandelt. Ist es IMMER ISO-8859-1 ?
Ich möchte ja eigentlich nur die richtige Anzahl Zeichen des Dateinamens.

Da war er, dein Hinweis, dass es dir um den Datei_namen_ geht. Aber den habe ich total überlesen, ich war auf die Codierung des Inhalts fixiert, weil der Name meist egal ist.

Ich hoffe, mein zweiter Versuch hilft dir nun etwas weiter.

So long,
 Martin

[1] Es gibt Ausnahmen. So wird der Zier-Schrägstrich U+2215 zum Beispiel einfach in den herkömmlichen Slash 0x2F gewandelt, das Euro-Zeichen U+20AC in sein Windows-1252-Pendant 0x80.

--
Heutzutage gilt ein Mann schon dann als Gentleman, wenn er wenigstens die Zigarette aus dem Mund nimmt, bevor er eine Frau küsst.
  (Barbra Streisand, US-Schauspielerin)