40

は?

上の写真の人物は、コンピュータ ウイルスに関する研究やコンピュータ セキュリティに関するTED トークで知られるコンピュータ セキュリティの専門家であるMikko Hyppönenによって数か月前にツイートされました。SOに関しては、その画像のみを投稿しますが、あなたはそのアイデアを理解しています. 明らかに、Web サイト全体に広めて訪問者をびっくりさせたいものではありません。

さらに調べてみると、この文字は 87 を超える発音区別記号 (制限はありますか?!) を組み合わせたタイのアルファベットの文字のように見えます。これにより、セキュリティ、ローカリゼーション、およびこの種の入力を処理する方法について考えるようになりました。私の検索では、Stack に関するこの質問にたどり着きました。次に、Michael Kaplan のブログ投稿 on stripping diacriticsにたどり着きました。その中で、彼は文字列をその「基本」文字に分解する方法を示しています (ここでは簡潔にするために簡略化しています)。

StringBuilder sb = new StringBuilder();
foreach (char c in "façade".Normalize(NormalizationForm.FormD))
{
    if (char.GetUnicodeCategory(c) != UnicodeCategory.NonSpacingMark)
        sb.Append(c);
}
Response.Write(sb.ToString()); // facade 

場合によってはこれがどのように役立つかはわかりますが、ユーザー入力に関しては、すべての分音記号を取り除くことになります。カプランが指摘するように、一部の言語では分音符号を削除すると、単語の意味が完全に変わる可能性があります。これは疑問を投げかけます:ユーザーの入力/出力で一部の分音符号を許可し、ミッコ・ヒッポーネンのユーバー文字などの他の極端なケースを除外するにはどうすればよいでしょうか?

4

3 に答える 3

27
于 2012-08-16T08:38:40.880 に答える
2

NormalizationForm.FormCの代わりに を使用して解決策を見つけたと思いますNormalizationForm.FormDMSDNによると:

[FormC] 可能であれば、Unicode 文字列が完全な正規分解を使用して正規化され、続いてシーケンスがプライマリ コンポジットに置き換えられることを示します。

これは、文字を基本形に分解し、一貫性のある一連のルールに基づいて再構成することを意味します。これは比較目的に役立つと思いますが、私の場合は完璧に機能します。üé、 などの文字Äは正確に分解/再構成されますが、偽の文字は再構成に失敗し、基本形のままになります。

ここに画像の説明を入力

于 2012-08-16T08:34:19.463 に答える