Peter Steinfeld: PHP "echte" Windows Unicode-Textdatei schreiben

Beitrag lesen

Hallo Martin,

ich vermute, um eine Fehlinformation deinerseits, was "Unicode" eigentlich ist.

Hmm, jain. Mir war schon klar das das irgendwas Windoofspezifisches sein würde, deshalb schrieb ich im Titel [ "echte" Windows-Unicode.. ].

Leider erstelle ich zur Zeit nur ANSI (oder ASCII?) Textdateien, welche das ntbackup verschmäht und deshalb (übrigens ohne Fehlermeldung) nicht arbeitet.

Also, dass das Windows-eigene Backup da so zickig ist, wusste ich bisher noch nicht; ich nutze es selbst auch nicht. Was du bisher erzeugt hast, sind vermutlich normale Textdateien, in denen jedes Zeichen genau ein Byte belegt. Das Ganze dann vermutlich als ISO-8859-1 (Windows nennt das dann "ANSI") oder noch wahrscheinlicher als Windows-1252 codiert.

Ja genau, es sind einfache Textdateien, als Windows-1252 codiert.

Wenn ich eine Textdatei mit dem ntbackup erstelle, und diese in meinem Texteditor (NoteTab Pro) öffne, sehe ich das dies eine Unicode-Datei ist.

Woran siehst du das?

Bis vorhin nur an der Meldung in der Statuszeile meines Editors:
  Read only [2933 bytes, 64 ines, last saved: 10.06.2006 14:47:00, Format: Unicode]

In der Zwischenzeit habe ich mir aber noch einen HexViewer installiert und die Dateien damit mal angeschaut. Es sind die normalen Textzeichen drin jeweils gefolgt von einem NullWert.

Was du siehst, ist vermutlich, dass diese Datei immer im Wechsel ein reguläres Textzeichen und ein Nullbyte enthält. Ja, das ist wohl Unicode, aber in der bescheuerten Codierung UTF-16, bei der jedes Zeichen 16bit, also zwei Bytes, belegt. Auch regedit erzeugt gern solche Dateien (aber der akzeptiert auch "normale" 8bit-Codierungen wie ISO-8859-x oder Windows-1252, jedoch nicht UTF-8).

Ja, so isses.

Wie schon gesagt: Du suchst nach einer Möglichkeit, Textdateien in UTF-16 zu erzeugen. Dieses Format benutzt Windows übrigens auch intern sehr viel.

Ja, so isses wohl.

UTF-16 habe ich nicht gewußt. Deshalb haben auch die Konvertierungen nach UTF-8 nicht gefruchtet.

Ich habe mittlerweile die folgende Lösung gefunden:
Über die COM-Schnittstelle die PHP in den WindowsDistributionen zur Verfügung stellt spreche ich das FSO (FileSystemObject) der ScriptingRuntime-ActiveX-DLL an, und lasse die dann eine "echte" Windows-Unicode-Textdatei schreiben.

Sozusagen VB-Script in PHP, ;-)
Nicht schön aber funktioniert und erspart mir eine weitergehende Auseinandersetzung mit den windowsspezifischen Codierungsformaten.
(Das ist einfach nicht meine Welt.)

Vielen Dank für die Aufklärung und ein schönes Wochenende,
Peter