Hallo Peter,
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]
Nur, weil Dein Editor das anzeigt, muss das nicht stimmen. Es gibt einen Unterschied zwischen Unicode und UTF-16 - Windows verwendet UTF-16 (Unicode ist sowieso keine Zeichenkodierung, sondern ein Zeichensatz). UTF-16 hat zwar eine ganze Menge mit Unicode zu tun, ist aber *nicht* das gleiche.
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.
Das stimmt so nicht ganz. In UTF-16 ist die Basiseinheit 2 Bytes groß; UTF-16 ist jedoch *keine* 16bit-Kodierung, da es Zeichen gibt, die in UTF-16 auch mit 4 Bytes kodiert werden. Für alle Zeichen aus ISO-8859-1 stimmt die Aussage, da die Kodierungswerte der einzelnen Zeichen in ISO-8859-1 mit den Codepositionen der einzelnen Zeichen im Unicode-Standard decken (und ISO-8859-1 nur ein Byte braucht). Allerdings verwendet Windows ja kein ISO-8859-1 sondern Windows-1252, was ISO-8859-1 ist, allerdings wird dort auch der in den ISO-Standards nicht verwendete Bereich zwischen 0x80 bis 0x9F genutzt - weswegen das Einfügen von Null-Bytes zwischen Windows-1252 *nicht* automatisch zu einem gültigen UTF-16-Text führt, da die zusätzlich eingefügten Zeichen wie das Euro-Zeichen bei 0x80 in Unicode eine komplett andere Codeposition haben, als ihr kodierter Wert in Windows-1252 - beim Eurozeichen wäre das 0x20AC (bei ISO-8859-1 funktioniert das dagegen - naja, fast, denn:) - ferner ist zu beachten, dass UTF-16 zwingend einen sog. BOM (Byte Order Mark) vorschreibt - der gibt an, wie die Bytes angeordnet sind (Little-Endian vs. Big-Endian). Wenn Du also einen ISO-8859-1-Text nimmst und dort dann noch 0-Bytes einfügst, erhälst Du nur dann einen gültigen UTF-16-Text, wenn Du noch einen korrekten BOM an den Anfang des Textes einfügst.
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.
Hälst Du es nicht für sinnvoller, den Text einfach nach UTF-16 zu konvertieren? Also $text = iconv('Windows-1252', 'UTF-16', $text);
Viele Grüße,
Christian
"I have always wished for my computer to be as easy to use as my telephone; my wish has come true because I can no longer figure out how to use my telephone." - Bjarne Stroustrup