13

スタックオーバーフローで分音記号を削除する方法を見つけましたが、分音記号を非分音記号に変更できるかどうか教えてください。

ああ..そして.NETについて考えます(不可能な場合は他のもの)

4

5 に答える 5

28

誰もこれを行うためのコードを投稿することを気にしたことがないので、ここにあります:

    // \p{Mn} or \p{Non_Spacing_Mark}: 
    //   a character intended to be combined with another 
    //   character without taking up extra space 
    //   (e.g. accents, umlauts, etc.). 
    private readonly static Regex nonSpacingMarkRegex = 
        new Regex(@"\p{Mn}", RegexOptions.Compiled);

    public static string RemoveDiacritics(string text)
    {
        if (text == null)
            return string.Empty;

        var normalizedText = 
            text.Normalize(NormalizationForm.FormD);

        return nonSpacingMarkRegex.Replace(normalizedText, string.Empty);
    }

注:これを行う必要がある大きな理由は、ASCIIのみを実行するサードパーティシステムに統合しているが、データがユニコードである場合です。これは一般的です。基本的には、アクセント付き文字を削除するか、アクセント付き文字からアクセントを削除して、元の入力を可能な限り保持するようにします。明らかに、これは完全な解決策ではありませんが、ASCII127より上の文字を単に削除するよりも80%優れています。

于 2010-07-22T23:25:27.277 に答える
11

自分の回答から別の質問へのコピー:

独自の表を作成する代わりに、テキストを正規化形式 D に変換することもできます。この形式では、文字は基本文字と分音符号で表されます (たとえば、「á」は「a」に置き換えられ、その後に結合鋭アクセントが続きます)。 )。その後、ASCII 文字以外のすべてを取り除くことができます。

テーブルはまだ存在しますが、現在は Unicode 標準のものです。

さらに多くのケースをキャッチするために、NFD の代わりに NFKD を試すこともできます。

参考文献:

于 2008-12-01T16:21:49.510 に答える
4

一歩下がって、なぜこれを行う必要があるのか​​を検討することも価値があるかもしれません。重要ではないと考える文字の違いを取り除こうとしている場合は、Unicode 照合アルゴリズムを調べる必要があります。これは、検索や並べ替えのために文字列を比較するときに、大文字と小文字の違いや分音記号などの違いを無視する標準的な方法です。

変更されたテキストを表示する予定がある場合は、対象者を考慮してください。安全に除外できるものは、ロケールに依存します。アメリカ英語では、"Igloo" = "igloo"、"resume" = "履歴書" ですが、トルコ語では小文字の I は ı (ドットなし) であり、フランス語では cote は引用を意味し、côté はサイドを意味し、côte は côte を意味します。海岸。そのため、照合言語によって、どの違いが重要かが決まります。

分音符号を削除することがアプリケーションにとって適切な解決策である場合は、変換する文字を明示的に追加する独自のテーブルを作成するのが最も安全です。

一般的な自動化されたアプローチは、Unicode 分解を使用して考案できます。これにより、分音符号のある文字を「結合」文字 (分音記号) とそれらが結合される基本文字に分解できます。結合文字であるすべてのものを除外すると、「非分音符号」のものを使用する必要があります。

ただし、自動化された方法での差別の欠如は、いくつかの予期しない影響を与える可能性があります. 代表的なテキスト本体で多くのテストを行うことをお勧めします。

于 2008-12-01T16:22:02.973 に答える
0

私のサイトは、多くの奇妙な文字を含む外部ソースからデータを入力します。次の C# 関数を作成して、アクセント記号付きの文字を置き換え、正規表現を使用して非 US キーボード文字を削除しました。

    using System.Text;
    using System.Text.RegularExpressions;

    internal static string SanitizeString(string source)
    {
        return Regex.Replace(source.Normalize(NormalizationForm.FormD), @"[^A-Za-z 0-9 \.,\?'""!@#\$%\^&\*\(\)-_=\+;:<>\/\\\|\}\{\[\]`~]*", string.Empty).Trim();    
    }

それが役に立てば幸い。

于 2012-01-16T19:20:50.187 に答える