2012-06-15 6 views
6

私は、複数の文字で構成された特殊文字を数える方法を見つけましたが、オンラインで解決策が見つかりませんでした。特殊なUTF-8文字を数えよう

私は文字列 "வாழைப்பழம"を数えたいと思う。実際にはタミル文字は6文字ですが、通常の方法で長さを検索すると9文字になります。私はこの問題を引き起こすエンコーディングの唯一の種類であり、これに対する解決策があるのだろうかと疑問に思っています。私は現在、C#で解決策を見つけようとしています。

答えて

9

利用StringInfo.LengthInTextElements)=事前にありがとう:

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

この挙動の説明はString.Lengthのドキュメントに記載されています:

プロパティが返しますこのインスタンスのCharオブジェクトの数。Unicode文字の数ではありません。その理由は、Unicode文字が複数のCharで表される可能性があるからです。 System.Globalization.StringInfoクラスを使用して、各Charの代わりに各Unicode文字を処理します。

+0

ありがとうございます!これは私が探しているものです!あなたを愛してます! = X – Cheng

3

マイナーnitpick:.NET用のUTF-16でstringのではなく、UTF-8


あなたは、文字列の長さの話をしているとき、あなたは可能性がいくつかの異なるものがあります平均:

  1. バイト単位の長さです。 これは、物事を見る古いCの方法です。
  2. ユニコードコードポイントの長さ。 これはあなたを現代に近づけさせ、文字列の長さを扱う方法でなければなりません。
  3. UTF-8/UTF-16コードの長さ これは最も一般的な解釈であり、1から派生しています。特定の文字は、エンコーディングで複数のコードユニットを使用します。
  4. 目に見える「文字」(graphemes)の数。 これは通常、人が文字列や文字列の長さを表すときに意味するものです。

あなたのケースでは、あなたの混乱は、4と3 3との差から茎4.あなたが期待するもので、C#が使用するものです。タミル語などの複雑なスクリプトでは、合字や発音区別記号が使用されます。合字は2つ以上の隣接する文字が1つのグリフに収縮したもので、あなたのケースではbulைは唇と房の結合で、後者は前者の外観を変えます。 דாもそのような合字です。発音区別符は、手紙の周りの装飾品である。 àの上のアクセント、または上のドット。

2つのケースでは、どちらも単一の文字として認識されますが、両方とも実際にはの文字が2つ必要です。だから、文字列の中に3つのコードポイントがある。

あなたのケースでは、2と3の区別は無関係ですが、一般的には留意してください。

+1

+1、良い分析。 – Heinzi