2

私のアプリは、アクセント付きの文字を含む可能性のある文字列を処理する必要があります。これらの名前をアルファベットの異なる文字のバケットにグループ化できる必要があります。

私は当初、.Net で CultureInvariant 文字列比較を使用することを考えていましたが、これには 2 つの問題があります。

  1. 文字 C が C cedilla と同じであるとは実際には言いませんが、その同等性が必要です。

  2. WinRT のバージョンの .Net には、オプションとして CultureInvariant がどこにもありません。

さまざまな文字をグループ化するために使用できるアルゴリズムまたは少なくとも出発点を誰かが提案できますか?

ありがとう。

4

2 に答える 2

0

この投稿、WinRT に String.Normalize() の代替手段はありますか? には、回答としてマークされたソリューションがあります。私はそれをテストしていませんが、テストしたらここにコメントします。

于 2013-06-30T17:48:09.747 に答える
0

ほとんどの状況でトリックを実行するコード(Michael S. Kaplan によって作成され、かなりの数の投稿で参照されています) があります。

static string RemoveDiacritics(string stIn)
{
    string stFormD = stIn.Normalize(NormalizationForm.FormD);
    StringBuilder sb = new StringBuilder();

    for (int ich = 0; ich < stFormD.Length; ich++)
    {
        UnicodeCategory uc = CharUnicodeInfo.GetUnicodeCategory(stFormD[ich]);
        if (uc != UnicodeCategory.NonSpacingMark)
        {
            sb.Append(stFormD[ich]);
        }
    }

    return (sb.ToString().Normalize(NormalizationForm.FormC));
}

Ç/C とアクセント付き/なしの文字でテストし、問題なく動作します (アポストロフィがあっても)。いずれにせよ、辞書ベースのアプローチまたは一連の条件/スイッチ...ケースを使用してこれを補完し、考えられるすべての不測の事態を説明する必要がある場合があります。例えば:

if (inputString.Contains("ß"))
{
     inputString = inputString.Replace("ß", "ss");
}
于 2013-06-30T17:26:29.487 に答える