So erhalten Sie die Byte-Größe der Multibyte-Zeichenfolge

8

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.

    
flacs 28.07.2010, 23:45
quelle

2 Antworten

3

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.

    
Dean Harding 28.07.2010, 23:53
quelle
9

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.

    
Thanatos 29.07.2010 00:08
quelle