2

海外からの訪問者から時折ヒットする WebForm 検索ページがあります。テキストを入力すると、プレーンな ASCII az、0-9 のように見えますが、太字で印刷されており、私の「このテキストは」ロジックでは入力を処理できません。ASP.NET で、A ~ Z、0 ~ 9 に相当する Unicode 文字をプレーンな古いテキストに変換する簡単な方法はありますか?

4

4 に答える 4

5

文字のいわゆる「全角フォーム」を取得しています。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();
}
于 2010-07-17T19:31:51.903 に答える
3

この質問の回答を参照してください。

次のメソッドが含まれています (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));
    }

このルーティングにより、分音符号が (可能な限り) 削除され、他の「奇妙な」文字が「通常の」形式に変換されます。

于 2010-07-22T10:00:40.267 に答える
3

プレーン ASCII az、0-9 のように見えますが、太字で印刷されています

これは、Unicode の「数学的な太字」文字である可能性があります。しかし、それは「全角」文字である可能性が高いです。(これらは、東アジアの文字エンコーディングでは一般的です。「全幅」は、漢字/漢字と同じ幅であることを指します。)

いずれかのセットを ASCII に変換するには、Unicode 正規化形式 KC または KD を使用します。

于 2010-07-17T22:36:52.563 に答える
0

あなたはこのようなことを試みるかもしれません:

Encoding.ASCII.GetString(Encoding.Convert(UnicodeEncoding, ASCIIEncoding, Encoding.Unicode.GetBytes(myString)));

ただし、入力の問題が何であるかはわかりません。あなたはテキストで正確に何をしていますか?アスキー文字以上のものが含まれているかどうかは重要ですか?そして、特に「太字で印刷されている」とはどういう意味かわかりません。

于 2010-07-16T19:11:19.617 に答える