c++ - zeichen - utf8 for cpp




Korrekte Verwendung des Zeichenfolgenspeichers in C und C++ (2)

Populäre Softwareentwickler und Unternehmen ( Joel Spolsky, Fog Creek Software ) neigen dazu, wchar_t für den Unicode-Zeichenspeicher zu verwenden, wenn sie C- oder C ++ - Code schreiben. Wann und wie sollte man char und wchar_t in Bezug auf gute Programmierpraktiken verwenden?

Ich bin besonders an der Einhaltung von POSIX interessiert, wenn ich Software schreibe, die Unicode nutzt.

Wenn Sie wchar_t verwenden , können Sie Zeichen in einem Array mit breiten Zeichen auf einer Basis pro Zeichen oder pro Array-Element nachschlagen:

/* C code fragment */
const wchar_t *overlord = L"ov€rlord";
if (overlord[2] == L'€')
    wprintf(L"Character comparison on a per-character basis.\n");

Wie können Sie Unicode-Bytes (oder -Zeichen) bei der Verwendung von char vergleichen ?

Bis jetzt sieht meine bevorzugte Art, Zeichenketten und Zeichen vom Typ char in C zu vergleichen, oft so aus:

/* C code fragment */
const char *mail[] = { "ov€[email protected]", "ov€[email protected]" };
if (mail[0][2] == mail[1][2] && mail[0][3] == mail[1][3] && mail[0][3] == mail[1][3])
    printf("%s\n%zu", *mail, strlen(*mail));

Diese Methode sucht nach dem Byte-Äquivalent eines Unicode-Zeichens. Das Unicode-Euro-Symbol € belegt 3 Bytes. Daher muss man drei Char-Array-Bytes vergleichen, um zu wissen, ob die Unicode-Zeichen übereinstimmen. Oft müssen Sie die Größe des Zeichens oder der Zeichenfolge kennen, die Sie vergleichen möchten, und die Bits, die für die Lösung erzeugt werden. Das sieht nicht nach einer guten Möglichkeit aus, Unicode überhaupt zu handhaben. Gibt es eine bessere Möglichkeit, Strings und Zeichenelemente vom Typ char zu vergleichen ?

Wie können Sie bei Verwendung von wchar_t den Inhalt der Datei in ein Array scannen? Die Funktion fread scheint keine gültigen Ergebnisse zu liefern.


Ich bin besonders an der Einhaltung von POSIX interessiert, wenn ich Software schreibe, die Unicode nutzt.

In diesem Fall möchten Sie wahrscheinlich UTF-8 (mit char ) als bevorzugten Unicode-String-Typ verwenden. POSIX hat nicht viele Funktionen, um mit wchar_t - das ist meistens eine Windows-Sache.

Diese Methode sucht nach dem Byte-Äquivalent eines Unicode-Zeichens. Das Unicode-Euro-Symbol € belegt 3 Bytes. Daher muss man drei Char-Array-Bytes vergleichen, um zu wissen, ob die Unicode-Zeichen übereinstimmen. Oft müssen Sie die Größe des Zeichens oder der Zeichenfolge kennen, die Sie vergleichen möchten, und die Bits, die für die Lösung erzeugt werden.

Nein, das tust du nicht. Sie vergleichen nur die Bytes. Wenn die Bytes übereinstimmen, stimmen die Zeichenfolgen überein. strcmp funktioniert genauso gut mit UTF-8 wie mit jeder anderen Kodierung.

Es sei denn, Sie möchten einen Vergleich ohne Berücksichtigung von Groß- / Kleinschreibung oder Akzent vornehmen. In diesem Fall benötigen Sie eine geeignete Unicode-Bibliothek.


Sie sollten niemals Bytes oder sogar Codepunkte vergleichen, um zu entscheiden, ob Strings gleich sind. Das liegt daran, dass viele Strings aus der Benutzerperspektive identisch sein können, ohne dass sie aus der Codepunktperspektive identisch sind.





posix