1. ホーム
  2. .net

[解決済み] .NETで文字列から発音区分符号(アクセント)を削除するにはどうすればよいですか?

2022-03-20 04:23:09

質問

フランス系カナダ人の文字列を変換しようとしているのですが、基本的には、文字を残したまま、文字の中のフランス語のアクセント記号を取ることができればと思っています。(例) 変換する ée ということで crème brûlée は次のようになります。 creme brulee )

これを実現するためには、どのような方法があるのでしょうか?

どのように解決するのですか?

私はこの方法を使ったことがないのですが、Michael Kaplanがブログの記事(紛らわしいタイトルですが)で、ダイアクリティクスのストリッピングについて述べているので、その方法を紹介します。 ストリッピングは面白い仕事です(通称 意味のないことの意味について、別名「オール Mn文字はノンスペーシングであるが あるものは、よりノンスペーシングである 他)

static string RemoveDiacritics(string text) 
{
    var normalizedString = text.Normalize(NormalizationForm.FormD);
    var stringBuilder = new StringBuilder(capacity: normalizedString.Length);

    for (int i = 0; i < normalizedString.Length; i++)
    {
        char c = normalizedString[i];
        var unicodeCategory = CharUnicodeInfo.GetUnicodeCategory(c);
        if (unicodeCategory != UnicodeCategory.NonSpacingMark)
        {
            stringBuilder.Append(c);
        }
    }

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

なお、これは以前の投稿のフォローアップです。 ダイアクリティクスを除去する...。

このアプローチでは 文字列.正規化 で入力文字列を構成するグリフに分割し (基本的に "基本文字と発音区分けをする)、その結果をスキャンして基本文字だけを保持します。ちょっとだけ複雑ですが、本当に複雑な問題を見ているようです。

もちろん、フランス語に限定するならば、シンプルなテーブルベースのアプローチである C++ std::stringのアクセントとチルダを削除する方法 というのは、@David Dibben が推奨しているからです。