2

我有一个 WebForm 搜索页面,偶尔会受到国际访问者的欢迎。当他们输入文本时,它似乎是纯 ASCII az, 0-9 但它们以粗体打印,我的“是这个文本”逻辑无法处理输入。ASP.NET 中是否有任何简单的方法可以将等同于 AZ、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

它似乎是纯 ASCII az, 0-9 但它们以粗体打印

这可能是 Unicode“数学粗体”字符。但更可能是“全角”字符 abcdefghijkllmnopqrstuvuvxyz0123456789。(这些在东亚字符编码中很常见:“全角”是指与汉字/汉字字符的宽度相同。)

要将任一集合转换为 ASCII,请使用Unicode 规范化形式 KC 或 KD。

于 2010-07-17T22:36:52.563 回答
3

你应该看看这个问题的答案。

它包括以下方法(来自 Michael Kaplan 的博客文章“剥离是一项有趣的工作”):

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 字符。这意味着它将转换ée,因为é实际上是从eand´字符构建的。
´是一个“NonSpacingMark”,意味着它将被添加到前一个字符。该方法尝试检测此特殊字符,并重建没有 NonSpacingMark 字符的字符串。(这是我的理解,这可能不是真的)。

这不适用于所有 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 回答
0

你可以尝试这样的事情:

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

虽然,我不确定输入的问题是什么。你到底在做什么?如果它包含的不仅仅是 ascii 字符,这有关系吗?而且,我特别不知道您所说的“它们以粗体打印”是什么意思。

于 2010-07-16T19:11:19.617 回答