Hi,
Puh, das Thema Codierung und Zeichensätze ist unerschöpflich :-)
ja, allerdings!
So ganz im Detail habe ich es noch nicht verstanden, was da mit den Apis und dem umcodieren passiert.
Okay. Also nochmal etwas anders.
----------------------------------------------------
| File system (internal) |
| UCS-2 (2 bytes per character) |
------------^---------------------------^-----------
| |
UCS-2 UCS-2
| |
ANSI-API Unicode-API
(compatibility layer) |
| |
Windows-1252 UCS-2
1 byte/char 2 bytes/char
| |
--------V-------- --------V--------
| Application 1 | | Application 2 |
----------------- -----------------
Ein Programmierer, der eine Anwendung für Windows schreibt, hat die Wahl, welches der beiden APIs er verwenden möchte. Entweder er nutzt das alte Kompatibilitäts-API, bei dem er sich um Codierungen nicht kümmern muss, weil es wie seit ASCII-Zeiten üblich 1 byte pro Zeichen verwendet, oder aber er verwendet das modernere Unicode-API (das es in Windows übrigens seit der Einführung der "langen Dateinamen" mit Windows 95 gibt), bei dem er aber wahrscheinlich alle Strings zwischen seiner Anwendung und dem Betriebssystem hin- und hercodieren muss, denn kaum eine Anwendung arbeitet intern mit UTF-16. Dafür kann er in Dateinamen Sonderzeichen aus dem Unicode-Zeichensatz verwenden. Aber lohnt sich der Aufwand, nur um in Dateinamen mehr Sonderzeichen nutzen zu können?
Die PHP-Programmierer haben sich in der Windows-Version von PHP wohl für die erste Möglichkeit entschieden. Das heißt, sämtliche Dateinamen (Namen, nicht Inhalte!) sind als Windows-1252-codiert zu betrachten.
Als wäre das noch nicht genug, gibt's natürlich auch noch den DOS Compatibility Layer. Denn im Konsolenfenster (DOS-Emulation) wird nochmal eine andere Zeichencodierung verwendet, nämlich CP437 - das ist der alte IBM-Zeichensatz, der auch fest in der Hardware aller Grafikkarten verankert ist und den alte DOS-Anwendungen erwarten. Aber damit müssen wir uns zum Glück nicht auch noch befassen.
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]
Verstehe ich es dann richtig, dass ich weiterhin hier mit strlen() arbeiten kann wenn es rein um die Länge eines Dateinamens unter Windows geht, da ja alle Zeichen 1 Byte pro zeichen sind?
Ja. Ohne Einschränkung.
Schönen Freitag noch,
Martin
Soso, der Klügere gibt nach.
Aber warum sollen sich immer nur die Dummen durchsetzen? .oO(?)