Unicode, wchar_t und Cch-Funktionen

10/03/2009 - 20:04 von Felix Opatz | Report spam
Hallo Leute,

ich habe ein paar Fragen bezüglich Unicode in Windows.

Zunàchst einmal stammt der erste Schwung meines Wissens aus der 5.
Auflage des Petzolds, der noch fest davon ausgeht, daß ein
Unicode-Zeichen genau 16 Bit hat, immer. Das Buch ist von 1999, ich
nehme also an, daß er sich auf UCS-2 in Windows NT 4.0 bezieht.

Okay, inzwischen habe ich den aktuellen Richter gelesen, und mich
genauer mit dem Thema Unicode beschàftigt. Seit Windows 2000 ist also
UTF16 die intern genutzte Repràsentation, die Gesetzmàßigkeit "ein
Zeichen = zwei Byte" die Petzold noch propagiert ist überholt, denn es
gibt Surrogate die auch aus zwei UTF16-Symbolen bestehen können.

Jetzt die interessanten Fragen:

Der C-Standard sagt mir, wchar_t ist geeignet jedes Zeichen der "current
locale" aufzunehmen. Aber für Windows mit sizeof(wchar_t) == 2 (und
CHAR_BIT == 8, für die Nitpicker) ist das doch nicht wahr, oder kann die
Locale nur die BMP (Basic Multilingual Plane) umfassen? Ansonsten
brauche ich doch auch ggf. mehrere wchar_t bzw. WCHAR um ein Zeichen
aufzunehmen.

Was mich zur nàchsten Frage bringt: die Cch-Funktionen, die einen
Character Count erwarten (z.B. StringCchCat), was genau wollen die? Wenn
ich das richtig verstehe, wollen die tatsàchlich die Zahl der Zeichen
haben, die für Unicode sowas wie Cch <= Cb / 2 sein muß, weil ja Zeichen
vorkommen könnten, die aus mehr als einem UTF16-Symbol bestehen. Ich muß
die also zàhlen.

Habe ich das so richtig verstanden?

Wenn ich mir das so überlege wàre es doch enorm hilfreich zu definieren
"in meiner Anwendung gibt es nur Zeichen die mit einem WCHAR dargestellt
werden können", und an allen Stellen an denen Daten in die Anwendung
reinkommen können eine entsprechende Prüfung durchzuführen. Man sollte
ja wohl mit der BMP auskommen können (für sagen wir mal 99,9% der
Anwendungen). Dann kann man wieder an "Lànge = Größe / 2" festhalten,
und insbesondere aus dem Stand an z.B. das 25. Zeichen einer
Zeichenkette springen, was nicht klappt, wenn es Surrogate geben könnte,
und man linear durchlaufen muß, um jedes Zeichen zu untersuchen.

Macht ihr das so? Wenn ja, wie filtert ihr? Die WCHARs direkt anschauen
und interpretieren?

Gruß,
Felix
 

Lesen sie die antworten

#1 Markus Schaaf
13/03/2009 - 02:06 | Warnen spam
Felix Opatz schrieb:

Der C-Standard sagt mir, wchar_t ist geeignet jedes Zeichen der "current
locale" aufzunehmen. Aber für Windows mit sizeof(wchar_t) == 2 (und
CHAR_BIT == 8, für die Nitpicker) ist das doch nicht wahr, oder kann die
Locale nur die BMP (Basic Multilingual Plane) umfassen? Ansonsten
brauche ich doch auch ggf. mehrere wchar_t bzw. WCHAR um ein Zeichen
aufzunehmen.



Der C-Standard geht davon aus, das wchar_t genau ein Zeichen
repràsentiert. Das war, wie Du bereits erkannt hast, auch die Idee von
WCHAR. Nach der Erweiterung des Unicode-Zeichenvorrats klappt das
theoretisch nicht mehr. Faktisch ist es jedoch immernoch so.

Was mich zur nàchsten Frage bringt: die Cch-Funktionen, die einen
Character Count erwarten (z.B. StringCchCat), was genau wollen die? Wenn
ich das richtig verstehe, wollen die tatsàchlich die Zahl der Zeichen
haben, die für Unicode sowas wie Cch <= Cb / 2 sein muß, weil ja Zeichen
vorkommen könnten, die aus mehr als einem UTF16-Symbol bestehen. Ich muß
die also zàhlen.



Nein, damit ist immer die Anzahl an WCHARs oder CHARs gemeint.

Ähnliche fragen