von mkarcher » Mo 30. Mai 2022, 21:45
Mitfühlender hat geschrieben: ↑Mo 30. Mai 2022, 19:02
Könnte das auch mit Unicode 16 Bit unter Windows zusammen hängen?
Habe das gleiche Problem. A..Z, a..z funktionieren, einige Sonderzeichen und ß, ä,ö,ü,Ä,Ö,Ü nicht und in einer Ascii Datei erschinen diese Zeichen als 2 Zeichen, die funktionierenden Zeichen bestehen auch einem einzigen Zeichen. Auch dann brigens, wenn ich als Ausgabtyp einen 8 bittigen String nehme.
Ja, mit Unicode schon, aber nicht mit dem 16-Bit-Unicode aus der Windows-Welt. Lass mich einmal ein bisschen zum Thema Unicode ausholen: Unicode ist zunächst einmal ein Zuweisung von Zeichennummern (Ganzzahlen) zu Bedeutungen ("Leerzeichen", "obere Hälfte Integral", "hebräischer Buchstabe Dalet", "lateinischer Buchstabe großes A"). Unicode wurde eingeführt, damit den verschiedenen Codepages (verschiedene Zeichensätze für Amerika mit vielen Grafikzeichen (437), Westeuropa (850), Osteuropa, Russisch, Griechisch, Türkisch, Hebräisch) ein Ende zu setzen, und einen unversell gültigen Zeichensatz zu bekommen. Dabei ist man zunächst davon ausgegangen, dass 65536 Zeichennummern reichen werden. Spätestens, als die CJK-Unification gescheitert ist (wo geplant war, dass gleiche/ähnliche Zeichen aus Chinesich, Japanisch und Koreanisch nur eine einzige Unicode-Nummer bekommen), wurde aber ein Bedarf für mehr Zeichen festgestellt. Da hatte Microsoft in COM/OLE unter Windows 3.x aber bereits 16-Bit-Unicode umgesetzt. Die Darstellung von Unicode-Zeichennummern zwischen 0 und 65535 als 16-Bit-Zahl nennt sich UCS-2 (Unicode Coding Scheme, 2 bytes per character). Auf 32-Bit-Unix-Maschinen war Unicode-Unterstützung direkt mit 32-Bit-Zahlen vorgesehen, das System nennt sich UCS-4, und könnte theroretisch 4 Milliarden verschiedene Zeichen darstellen, wobei nur der positive Bereich von vorzeichenbehafteten 32-Bit-Zahlen zur Benutzung als Unicode-Nummern gedacht war, wodurch nur 2 Milliarden Werte übrig bleiben.
Alle Textdateien mit 4 Byte pro Zeichen zu kodieren kam aber nicht in Frage, deshalb wurde ein Speicher/Übertragungs-Format auf Basis von 8-Bit-Symbolen entworfen, UTF-8 ("Unicode Transformation Format, 8 bits). Dieses Format erlaubt es 7-bit-ASCII-Zeichen in einem Byte darzustellen, europäische Umlaute, kyrillische und hebräische Zeichen mit 2 Byte, alle sonsitigen 16-Bit-Unicode-Zeichen mit 3 Byte, und Zeichen mit Zeichen mit noch größeren Nummern in 4 (bis zu 21 Bit), 5 (bis zu 26 Bit) oder 6 (bis zu 31 Bit) Bytes dargestellt werden. Das das System nicht zu UCS-2 passt, was mit 16-Bit-Einheiten arbeitet, aber durch die Nutzung unter anderem in MS-COM/OLE UCS-2 schon sehr weit verbreitet war, wurde auch eine Erweiterung zu UCS-2 entwickelt. Nicht alle Zahlen unter 65536 waren zu dem Zeitpunkt bereits mit Zeichen versehen, und daher wurde dann im 16-Bit-Bereich ein Bereich von 2048 Zeichen reserviert. 1024 davon heißen "high surrogates" (hohe Ersatzzeichen), und die anderen 1024 "low surrogates" (niedriege Ersatzzeichen). Diese Zeichen treten immer paarweise auf, und ergeben zusammen ein 20-Bit-Nummer für ein "erweitertes Unicode-Zeichen". Das Verfahren, mit Hilfe von Surrogates etwas mehr als eine Million Zeichen darstellen zu können, nennt sich jetzt UTF-16, und definiert den gültigen Zeichenvorrat von Unicode. Es gibt 2^16 Basiszeichen (mit Löchern im Raum, z.B. für die Surrogates) und 2^20 Erweiterungszeichen, so dass eine Unicode-Zeichennummer immer zwischen 0 und 2^16 + 2 ^ 20 - 1 liegt, und damit mit 21 Bits darstellbar ist. Damit wurden dann die 5-Byte und 6-Byte-Formate von UTF-8 ebenfalls obsolet.
Was wir heute also haben, ist "Windows 16-Bit-Unicode" als Bezeichnung für UTF-16, und "UTF-8". Textdateien, in denen US-Zeichen ein Byte belegen, und deutsche Umlaute 2 Byte, sind also UTF-8-kodiert, nicht UTF-16-kodiert. UTF-8 hat sich als das Standardformat für Unicode-Textdateien überall da durchgesetzt, wo Kompatibilität mit UCS-2 nicht notwendig ist. Man sieht die zwei-
Byte-Darstellung von Umlauten in UTF-8-kodierten Textdateien dann als zwei
Zeichen fehlinterpretiert, zum Beispiel bei Interpretation der Byte-Werte als 8-Bit-Zeichennummern gemäß Codepage 437 (DOS) oder Codepage 1252 (Windows-8-Bit-Zeichensatz "Westeuropa").
[quote=Mitfühlender post_id=93662 time=1653930172]
Könnte das auch mit Unicode 16 Bit unter Windows zusammen hängen?
Habe das gleiche Problem. A..Z, a..z funktionieren, einige Sonderzeichen und ß, ä,ö,ü,Ä,Ö,Ü nicht und in einer Ascii Datei erschinen diese Zeichen als 2 Zeichen, die funktionierenden Zeichen bestehen auch einem einzigen Zeichen. Auch dann brigens, wenn ich als Ausgabtyp einen 8 bittigen String nehme.
[/quote]
Ja, mit Unicode schon, aber nicht mit dem 16-Bit-Unicode aus der Windows-Welt. Lass mich einmal ein bisschen zum Thema Unicode ausholen: Unicode ist zunächst einmal ein Zuweisung von Zeichennummern (Ganzzahlen) zu Bedeutungen ("Leerzeichen", "obere Hälfte Integral", "hebräischer Buchstabe Dalet", "lateinischer Buchstabe großes A"). Unicode wurde eingeführt, damit den verschiedenen Codepages (verschiedene Zeichensätze für Amerika mit vielen Grafikzeichen (437), Westeuropa (850), Osteuropa, Russisch, Griechisch, Türkisch, Hebräisch) ein Ende zu setzen, und einen unversell gültigen Zeichensatz zu bekommen. Dabei ist man zunächst davon ausgegangen, dass 65536 Zeichennummern reichen werden. Spätestens, als die CJK-Unification gescheitert ist (wo geplant war, dass gleiche/ähnliche Zeichen aus Chinesich, Japanisch und Koreanisch nur eine einzige Unicode-Nummer bekommen), wurde aber ein Bedarf für mehr Zeichen festgestellt. Da hatte Microsoft in COM/OLE unter Windows 3.x aber bereits 16-Bit-Unicode umgesetzt. Die Darstellung von Unicode-Zeichennummern zwischen 0 und 65535 als 16-Bit-Zahl nennt sich UCS-2 (Unicode Coding Scheme, 2 bytes per character). Auf 32-Bit-Unix-Maschinen war Unicode-Unterstützung direkt mit 32-Bit-Zahlen vorgesehen, das System nennt sich UCS-4, und könnte theroretisch 4 Milliarden verschiedene Zeichen darstellen, wobei nur der positive Bereich von vorzeichenbehafteten 32-Bit-Zahlen zur Benutzung als Unicode-Nummern gedacht war, wodurch nur 2 Milliarden Werte übrig bleiben.
Alle Textdateien mit 4 Byte pro Zeichen zu kodieren kam aber nicht in Frage, deshalb wurde ein Speicher/Übertragungs-Format auf Basis von 8-Bit-Symbolen entworfen, UTF-8 ("Unicode Transformation Format, 8 bits). Dieses Format erlaubt es 7-bit-ASCII-Zeichen in einem Byte darzustellen, europäische Umlaute, kyrillische und hebräische Zeichen mit 2 Byte, alle sonsitigen 16-Bit-Unicode-Zeichen mit 3 Byte, und Zeichen mit Zeichen mit noch größeren Nummern in 4 (bis zu 21 Bit), 5 (bis zu 26 Bit) oder 6 (bis zu 31 Bit) Bytes dargestellt werden. Das das System nicht zu UCS-2 passt, was mit 16-Bit-Einheiten arbeitet, aber durch die Nutzung unter anderem in MS-COM/OLE UCS-2 schon sehr weit verbreitet war, wurde auch eine Erweiterung zu UCS-2 entwickelt. Nicht alle Zahlen unter 65536 waren zu dem Zeitpunkt bereits mit Zeichen versehen, und daher wurde dann im 16-Bit-Bereich ein Bereich von 2048 Zeichen reserviert. 1024 davon heißen "high surrogates" (hohe Ersatzzeichen), und die anderen 1024 "low surrogates" (niedriege Ersatzzeichen). Diese Zeichen treten immer paarweise auf, und ergeben zusammen ein 20-Bit-Nummer für ein "erweitertes Unicode-Zeichen". Das Verfahren, mit Hilfe von Surrogates etwas mehr als eine Million Zeichen darstellen zu können, nennt sich jetzt UTF-16, und definiert den gültigen Zeichenvorrat von Unicode. Es gibt 2^16 Basiszeichen (mit Löchern im Raum, z.B. für die Surrogates) und 2^20 Erweiterungszeichen, so dass eine Unicode-Zeichennummer immer zwischen 0 und 2^16 + 2 ^ 20 - 1 liegt, und damit mit 21 Bits darstellbar ist. Damit wurden dann die 5-Byte und 6-Byte-Formate von UTF-8 ebenfalls obsolet.
Was wir heute also haben, ist "Windows 16-Bit-Unicode" als Bezeichnung für UTF-16, und "UTF-8". Textdateien, in denen US-Zeichen ein Byte belegen, und deutsche Umlaute 2 Byte, sind also UTF-8-kodiert, nicht UTF-16-kodiert. UTF-8 hat sich als das Standardformat für Unicode-Textdateien überall da durchgesetzt, wo Kompatibilität mit UCS-2 nicht notwendig ist. Man sieht die zwei-[i]Byte[/i]-Darstellung von Umlauten in UTF-8-kodierten Textdateien dann als zwei [i]Zeichen[/i] fehlinterpretiert, zum Beispiel bei Interpretation der Byte-Werte als 8-Bit-Zeichennummern gemäß Codepage 437 (DOS) oder Codepage 1252 (Windows-8-Bit-Zeichensatz "Westeuropa").