1

それが LengthInTextElements プロパティの目的だと思っていたでしょう。MSDNによると、このプロパティは次のとおりです。

この StringInfo オブジェクト内の基本文字、サロゲート ペア、結合文字シーケンスの数。

したがって、結合シーケンスを単一の文字としてカウントする必要があるように見えます。しかし、それが機能しないか、根本的に何かを誤解しています。このくだらないテストプログラム...

static void Main(string[] args)
    {
        string foo = "\u0301\u0065";
        Console.WriteLine(string.Format("String:\t{0}", foo));
        Console.WriteLine(string.Format("Length:\t{0}", foo.Length));
        Console.WriteLine(string.Format("TextElements:\t{0}", new StringInfo(foo).LengthInTextElements));
        Console.ReadLine();
    }

この出力を生成します...

文字列: `e
長さ: 2
TextElements: 2

結合シーケンス「\u0301\u0065」を 1 文字として数えたいと思います。これは StringInfo で実行できますか?


さて、私は自分が間違っていたことを理解しました。それはやや恥ずかしいことです。文字と分音記号の順序を逆にしていました。したがって、次の非常に小さな変更を加えることで問題が修正されます。

static void Main(string[] args)
    {
        string foo = "\u0065\u0301";
        Console.WriteLine(string.Format("String:\t{0}", foo));
        Console.WriteLine(string.Format("Length:\t{0}", foo.Length));
        Console.WriteLine(string.Format("TextElements:\t{0}", new StringInfo(foo).LengthInTextElements));
        Console.ReadLine();
    }

つまり...テストデータを正しくエンコードするだけの問題でした。

4

1 に答える 1

0

これは StringInfo ではできないと思います。このメソッドは、結合文字を返すだけではありません。必要なことを行うための拡張メソッドを簡単に作成できます。何かのようなもの:

/// <summary>
/// determine number of combining characters in string
/// </summary>
/// <param name="input"><see cref="System.String"/>string to check</param>
/// <returns>integer</returns>
public static int NumberOfCombiningCharacters(this string input)
{
    return input.Where(c => c >= 768 && c <= 879).Count();            
}

次に、拡張メソッドを呼び出します。

string foo = "\u0301\u0065";
int a = foo.NumberOfCombiningCharacters();
于 2014-10-07T21:57:45.007 に答える