Wie bekomme ich die Byte-Größe einer Multibyte-Zeichenfolge in Visual C? Gibt es eine Funktion oder muss ich die Charaktere selbst zählen?
Oder, allgemeiner, wie bekomme ich die richtige Byte-Größe einer TCHAR-Zeichenfolge?
Lösung:
%Vor% BEARBEITEN:
Ich sprach nur über nullterminierte Strings.
Laut MSDN entspricht _tcslen
strlen
wenn _MBCS
definiert ist. strlen
gibt die Anzahl der Bytes in der Zeichenfolge zurück. Wenn Sie _tcsclen
verwenden, entspricht _mbslen
der Zahl der Multibyte-Zeichen .
Außerdem enthalten Multibyte-Strings nicht (AFAIK) eingebettete Nullen, nein.
Ich würde die Verwendung einer Multibyte-Codierung an erster Stelle in Frage stellen. Wenn Sie jedoch keine Legacy-App unterstützen, gibt es keinen Grund, Multibyte über Unicode zu wählen.
Mal sehen, ob ich das klären kann:
"Multi-Byte-Zeichenfolge" ist zunächst ein vager Begriff, aber in der Welt von Microsoft bedeutet es normalerweise "nicht ASCII und nicht UTF-16". Daher könnten Sie eine Zeichencodierung verwenden, die 1 Byte pro Zeichen oder 2 Byte oder möglicherweise mehr verwendet. Sobald Sie das tun, die Anzahl der Zeichen in der Zeichenfolge! = Die Anzahl der Bytes in der Zeichenfolge.
Nehmen wir UTF-8 als Beispiel, obwohl es nicht auf MS-Plattformen verwendet wird. Das Zeichen é ist im Speicher als "c3 a9" codiert - also zwei Bytes, aber 1 Zeichen. Wenn ich die Zeichenfolge "thé" habe, ist es:
%Vor%Dies ist eine "null terminated" Zeichenfolge, in der sie mit einer Null endet. Wenn wir möchten, dass unsere Zeichenfolge Nullen enthält, müssen wir die Größe auf andere Weise speichern, beispielsweise:
%Vor% ... und eine Reihe von Funktionen, um damit umzugehen. (So funktioniert std::string
ziemlich grob.)
Bei Zeichenfolgen mit Null-Beendigung berechnet strlen()
jedoch ihre Größe in Bytes , keine Zeichen. (Es gibt andere Funktionen zum Zählen von Zeichen) strlen
zählt nur die Anzahl der Bytes, bevor es ein 0 Byte sieht - nichts Besonderes.
Nun beziehen sich "Wide" - oder "Unicode" -Strings in der Welt von MS auf UTF-16-Strings. Sie haben ähnliche Probleme wie die Anzahl der Bytes! = Die Anzahl der Zeichen. (Auch: die Anzahl der Bytes / 2! = Die Anzahl der Zeichen) Lassen Sie sich das nochmal ansehen:
%Vor% Das ist "thé" in UTF-16, gespeichert in Little Endian (das ist der typische Desktop). Beachten Sie alle 00 Bytes - diese Reise nach oben. Also rufen wir wcslen
auf, was es als 2-Byte short
s ansieht, nicht einzelne Bytes.
Schließlich haben Sie TCHAR
s, was einer der beiden oben genannten Fälle ist, abhängig davon, ob UNICODE
definiert ist. _tcslen
ist die entsprechende Funktion (entweder strlen
oder wcslen
) und TCHAR
ist entweder char
oder wchar_t
. TCHAR
wurde erstellt, um die Umstellung auf UTF-16 in der Windows-Welt zu erleichtern.
Tags und Links string c size character-encoding multibyte