Following system colour scheme Selected dark colour scheme Selected light colour scheme

Python Enhancement Proposals

PEP 277 – Unterstützung für Unicode-Dateinamen unter Windows NT

Autor:
Neil Hodgson <neilh at scintilla.org>
Status:
Final
Typ:
Standards Track
Erstellt:
11. Jan 2002
Python-Version:
2.3
Post-History:


Inhaltsverzeichnis

Zusammenfassung

Dieses PEP diskutiert die Unterstützung des Zugriffs auf alle möglichen Dateien unter Windows NT, indem Unicode-Dateinamen direkt an die Wide-Character-Funktionen des Systems übergeben werden.

Begründung

Python 2.2 auf Win32-Plattformen wandelt Unicode-Dateinamen, die an `open` und Funktionen im `os`-Modul übergeben werden, in die ‚mbcs‘-Kodierung um, bevor das Ergebnis an das Betriebssystem übergeben wird. Dies ist oft erfolgreich in dem üblichen Fall, in dem das Skript mit der Locale ausgeführt wird, die denselben Wert hat wie zum Zeitpunkt der Dateierstellung. Die meisten Rechner sind auf eine Locale eingestellt und werden selten oder nie von dieser Locale geändert. Für einige Benutzer wird die Locale häufiger geändert, und auf Servern gibt es oft Dateien, die von Benutzern mit unterschiedlichen Locales gespeichert wurden.

Unter Windows NT und seinen Nachfolgebetriebssystemen, einschließlich Windows 2000 und Windows XP, stehen Wide-Character-APIs zur Verfügung, die direkten Zugriff auf alle Dateinamen bieten, einschließlich derjenigen, die nicht in der aktuellen Locale darstellbar sind. Der Zweck dieses Vorschlags ist es, über das Standard-Python-Datei-Objekt und das `posix`-Modul Zugriff auf diese Wide-Character-APIs zu ermöglichen und somit Zugriff auf alle Dateien unter Windows NT zu bieten.

Spezifikation

Auf Windows-Plattformen, die Wide-Character-Datei-APIs bereitstellen, werden bei Übergabe von Unicode-Argumenten an Datei-APIs Wide-Character-Aufrufe anstelle der Standard-C-Bibliothek und `posix`-Aufrufe durchgeführt.

Das Python-Datei-Objekt wird so erweitert, dass es ein Unicode-Dateinamen-Argument direkt verwendet, anstatt es umzuwandeln. Dies betrifft den Konstruktor des Datei-Objekts `file(filename[, mode[, bufsize]])` und auch die `open`-Funktion, die ein Alias für diesen Konstruktor ist. Wenn hier ein Unicode-Dateinamen-Argument verwendet wird, dann ist das `name`-Attribut des Datei-Objekts Unicode. Die Darstellung eines Datei-Objekts, `repr(f)`, zeigt Unicode-Dateinamen als eskapierte Zeichenkette an, ähnlich wie die Darstellung von Unicode-Zeichenketten.

Das `posix`-Modul enthält Funktionen, die Datei- oder Verzeichnisnamen entgegennehmen: `chdir`, `listdir`, `mkdir`, `open`, `remove`, `rename`, `rmdir`, `stat` und `_getfullpathname`. Diese werden Unicode-Argumente direkt verwenden, anstatt sie umzuwandeln. Für die `rename`-Funktion wird dieses Verhalten ausgelöst, wenn eines der Argumente Unicode ist und das andere Argument unter Verwendung der Standardkodierung in Unicode umgewandelt wird.

Die `listdir`-Funktion gibt derzeit eine Liste von Zeichenketten zurück. Gemäß diesem Vorschlag wird sie eine Liste von Unicode-Zeichenketten zurückgeben, wenn ihr Pfad-Argument Unicode ist.

Einschränkungen

Auf den Consumer-Windows-Betriebssystemen Windows 95, Windows 98 und Windows ME gibt es keine Wide-Character-Datei-APIs, daher bleibt das Verhalten unter diesem Vorschlag unverändert. Es könnte in Zukunft möglich sein, diesen Vorschlag auf diese Betriebssysteme auszuweiten, da das von ihnen verwendete VFAT-32-Dateisystem Unicode-Dateinamen unterstützt, der Zugriff jedoch schwierig ist und die Implementierung viel Arbeit erfordern würde. Die „Microsoft Layer for Unicode“ könnte ein Ausgangspunkt für die Implementierung sein.

Python kann mit einer Größe von 4 Bytes für Unicode-Zeichen anstelle von 2 Bytes kompiliert werden, indem `PY_UNICODE_TYPE` als 4-Byte-Typ und `Py_UNICODE_SIZE` als 4 definiert werden. Da die Windows-API keine 4-Byte-Zeichen akzeptiert, funktionieren die in diesem Vorschlag beschriebenen Funktionen in diesem Modus nicht, sodass die Implementierung auf die aktuelle ‚mbcs‘-Kodierungstechnik zurückfällt. Diese Einschränkung könnte in Zukunft durch zusätzliche Konvertierungen mit `PyUnicode_AsWideChar` aufgehoben werden, aber im Moment würde dies zu viel Komplexität für ein sehr selten verwendetes Feature bedeuten.

Referenzimplementierung

Die Implementierung ist verfügbar unter [2].

Referenzen

[1] Microsoft Windows APIs https://msdn.microsoft.com/


Quelle: https://github.com/python/peps/blob/main/peps/pep-0277.rst

Zuletzt geändert: 2025-02-01 08:55:40 GMT