2017-03-15 3 views
-1

Ich habe eine Zeichenfolge wie folgt:Wie erhält man die Byte-Länge eines Strings?

string a1 = "{`name`:`санкт_петербург`,`shortName`:`питер`,`hideByDefault`:false}"; 

a1. length zeigt, dass die String-Länge ist, was nicht wahr ist: so groß sind doppelt Cyrillic Symbole (wegen der UTF-16-Codierung, nehme ich an), deshalb Die tatsächliche Länge dieser Zeichenfolge ist .

Ich muss entweder die Anzahl der kyrillischen Symbole in der Zeichenfolge erhalten oder die tatsächliche Länge der Zeichenfolge auf andere Weise erhalten.

+2

* Alle *. NET-Zeichenfolgen sind UTF16. * Alle * Zeichen sind 2 Bytes lang. '.Length' gibt die Anzahl der Zeichen zurück, nicht die Anzahl der Bytes. Die Zeichenfolge hat 68 Zeichen und benötigt 136 Bytes –

+2

Was ist 'Encoding.GetByteCount'? –

+0

Auch bei "ASCII" -Zeichen bleiben Länge und Größe gleich. Für 'name' ist die Länge 4 und verwendet 8 Bytes. –

Antwort

3

Vom MSDN:

Das .NET Framework verwendet die UTF-16-Codierung (durch die Unicodeen Klasse dargestellt) zu repräsentieren Zeichen und String

So a1.Length in UTF-16-Code Einheiten (What's the difference between a character, a code point, a glyph and a grapheme?). Kyrillische Zeichen, die sich in der Basis-BMP (Base Multilingual Plane) befinden, verwenden alle eine einzige Codeeinheit (also eine einzelne char). Viele Emoji benutzen zum Beispiel ZWEI Code-Einheiten (zwei char, 4 Bytes!) ... Sie sind nicht in der BMP. Siehe zum Beispiel https://ideone.com/ASDORp.

Wenn Sie die Größe IN BYTES wollen, a1.Length * 2 ist eindeutig die Länge :-) Wenn Sie in UTF8 wissen wollen (eine sehr häufige Codierung, nicht intern von .NET verwendet, aber sehr durch das Web, XML,. ..) wie viele Bytes es wäre Encoding.UTF8.GetByteCount(a1)

+0

2 Bytes, richtig? Nicht 2 char. –

+0

Ja, 'Encoding.UTF8.GetByteCount (a1)' funktioniert. Vielen Dank. –

+0

@PatrickHofman Neue Emoji sind 2 char, 4 Bytes Zum Beispiel ist 2xchars. Siehe https://ideone.com/ASDORp – xanatos

Verwandte Themen