海外からの訪問者から時折ヒットする WebForm 検索ページがあります。テキストを入力すると、プレーンな ASCII az、0-9 のように見えますが、太字で印刷されており、私の「このテキストは」ロジックでは入力を処理できません。ASP.NET で、A ~ Z、0 ~ 9 に相当する Unicode 文字をプレーンな古いテキストに変換する簡単な方法はありますか?
4 に答える
文字のいわゆる「全角フォーム」を取得しています。Unicode では、これらはコードポイント U+FF01 から U+FF5E でエンコードされます。それらから ASCII コードポイント (U+0021 から U+007E) を取得するには、それらのコードポイントを取得し、そこから (0xFF01 - 0x0021) を減算する必要があります。
ASCII: http://unicode.org/charts/PDF/U0000.pdf
全角形式: http://unicode.org/charts/PDF/UFF00.pdf
私は ASP.NET を話せませんが、Java ではコードは次のようになります。
String decodeFullwidth(String s) {
StringBuilder sb = new StringBuilder();
for (int i = 0; i < s.length(); i++) {
char c = s.charAt(i);
if (0xFF01 <= c && c <= 0xFF5E) {
sb.append((char) (c - (0xFF01 - 0x0021)));
} else {
sb.append(c);
}
}
return sb.toString();
}
この質問の回答を参照してください。
次のメソッドが含まれています (Michael Kaplan のブログ エントリ " Stripping is an Interesting Job " から)。
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));
}
これにより、文字列からすべての NonSpacingMark 文字が削除されます。これは、実際にはand文字から構築されているため、に変換é
されることを意味します。
は「NonSpacingMark」で、前の文字に追加されることを意味します。このメソッドは、この特殊文字の検出を試み、NonSpacingMark 文字を含まない文字列を再構築します。(これは私が理解している方法であり、これは真実ではないかもしれません)。e
é
e
´
´
これはすべての Unicode 文字で機能するわけではありませんが、ラテン語ベースの文字セット (英語、スペイン語、フランス語、ドイツ語など) を使用するユーザーからの入力は「消去」されます。アジアの文字セットの経験はありません。
フィードバック後
この質問へのコメントと回答から得た情報に合わせてルーチンを調整しました。私の現在のバージョンは次のとおりです。
public 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]);
switch (uc) {
case UnicodeCategory.NonSpacingMark:
break;
case UnicodeCategory.DecimalDigitNumber:
sb.Append(CharUnicodeInfo.GetDigitValue(stFormD[ich]).ToString());
break;
default:
sb.Append(stFormD[ich]);
break;
}
}
return (sb
.ToString()
.Normalize(NormalizationForm.FormKC));
}
このルーティングにより、分音符号が (可能な限り) 削除され、他の「奇妙な」文字が「通常の」形式に変換されます。
プレーン ASCII az、0-9 のように見えますが、太字で印刷されています
これは、Unicode の「数学的な太字」文字である可能性があります。しかし、それは「全角」文字である可能性が高いです。(これらは、東アジアの文字エンコーディングでは一般的です。「全幅」は、漢字/漢字と同じ幅であることを指します。)
いずれかのセットを ASCII に変換するには、Unicode 正規化形式 KC または KD を使用します。
あなたはこのようなことを試みるかもしれません:
Encoding.ASCII.GetString(Encoding.Convert(UnicodeEncoding, ASCIIEncoding, Encoding.Unicode.GetBytes(myString)));
ただし、入力の問題が何であるかはわかりません。あなたはテキストで正確に何をしていますか?アスキー文字以上のものが含まれているかどうかは重要ですか?そして、特に「太字で印刷されている」とはどういう意味かわかりません。