2012-06-15 9 views
6

Ich finde einen Weg, Sonderzeichen, die Form von mehr als einem Zeichen zu zählen, aber keine Lösung online zu finden!Zählen spezielle UTF-8-Zeichen

Für z.B. Ich möchte die Zeichenfolge "வாழைபவாழைபபழம" zählen. Es besteht tatsächlich aus 6 tamilischen Charakter, aber seine 9 Zeichen in diesem Fall, wenn wir den normalen Weg verwenden, um die Länge zu finden. Ich frage mich, ist Tamil die einzige Art der Codierung, die dieses Problem verursacht und wenn es eine Lösung für dieses Problem gibt. Ich versuche derzeit, eine Lösung in C# zu finden.

Vielen Dank im Voraus =)

Antwort

9

Verwendung StringInfo.LengthInTextElements:

var text = "வாழைப்பழம"; 
Console.WriteLine(text.Length);        // 9 
Console.WriteLine(new StringInfo(text).LengthInTextElements); // 6 

Die Erklärung für dieses Verhalten kann in der Dokumentation von String.Length finden:

Die Länge Eigenschaft gibt zurück die Anzahl der Char-Objekte in diesem Fall, nicht die Anzahl der Unicode-Zeichen. Der Grund dafür ist, dass ein Unicode-Zeichen möglicherweise durch mehr als ein Zeichen repräsentiert wird. Verwenden Sie die Klasse System.Globalization.StringInfo, um mit jedem Unicode-Zeichen statt mit jedem Zeichen zu arbeiten.

+0

Danke !! Das ist die Sache, die ich suche !! Ich liebe dich! = X – Cheng

3

A minor nitpick: string s in .NET Anwendung UTF-16, nicht UTF-8


Wenn Sie über die Länge eines Strings zu sprechen, gibt es verschiedene Dinge, die man Mittelwert:

  1. Länge in Bytes. & # x2003; Das ist normalerweise die alte Art, Dinge zu betrachten.
  2. Länge in Unicode-Codepunkten. & # x2003; Dies bringt Sie näher an die modernen Zeiten und sollte der Weg sein, wie Stringlängen behandelt werden, außer es ist nicht.
  3. Länge in UTF-8/UTF-16 Code Einheiten. & # x2003; Dies ist die gängigste Interpretation, abgeleitet von 1. Bestimmte Zeichen benötigen mehr als eine Codeeinheit in diesen Codierungen, was die Dinge komplizierter macht, wenn Sie dies nicht erwarten.
  4. Anzahl der sichtbaren "Zeichen" (Grapheme). & # x2003; Das ist normalerweise was Leute meinen, wenn sie Zeichen oder Länge einer Schnur sagen.

In Ihrem Fall stammt Ihre Verwirrung aus der Differenz zwischen 4. und 3. 3. ist das, was C# verwendet, 4. ist das, was Sie erwarten. Komplexe Skripte wie Tamil verwenden Ligaturen und diakritische Zeichen. Ligaturen sind Kontraktionen von zwei oder mehr benachbarten Zeichen zu einer einzigen Glyphe - in Ihrem Fall ist ழை eine Ligatur von ழ und ை - wobei letztere die Erscheinung der ersteren verändert; வா ist auch eine solche Ligatur. Diakritische Zeichen sind Ornamente um einen Buchstaben herum, z.B. der Akzent in oder der Punkt über ப.

Die beiden Fälle, die ich erwähnte, ergeben beide ein einzelnes Graphem (was Sie als ein einzelnes Zeichen wahrnehmen), aber beide benötigen zwei tatsächliche Zeichen jeweils. Sie haben also drei weitere Codepunkte in der Zeichenfolge.

Eine Sache zu beachten: Für Ihren Fall ist die Unterscheidung zwischen 2. und 3. irrelevant, aber im Allgemeinen sollten Sie es im Hinterkopf behalten.

+1

+1, gute Analyse. – Heinzi