Der Martin: Welche Zeichencodierung unter Windows ?

Beitrag lesen

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(?)