如何转换已发布的内容;英文「;来自国际PC的字符';在ASP.NET中是什么?(例如2;2;0;5;)

如何转换已发布的内容;英文「;来自国际PC的字符';在ASP.NET中是什么?(例如2;2;0;5;),asp.net,unicode,internationalization,codepages,Asp.net,Unicode,Internationalization,Codepages,我有一个网络表单搜索页面,偶尔会被国际访问者点击。当它们以文本形式输入时,显示为纯ASCII a-z,0-9,但它们以粗体打印,并且我的“is this text”逻辑无法处理输入。在ASP.NET中有没有简单的方法可以将等同于A-Z,0-9的Unicode字符转换为纯文本?您可以尝试以下方法: Encoding.ASCII.GetString(Encoding.Convert(UnicodeEncoding, ASCIIEncoding, Encoding.Unicode.GetBytes(m

我有一个网络表单搜索页面,偶尔会被国际访问者点击。当它们以文本形式输入时,显示为纯ASCII a-z,0-9,但它们以粗体打印,并且我的“is this text”逻辑无法处理输入。在ASP.NET中有没有简单的方法可以将等同于A-Z,0-9的Unicode字符转换为纯文本?

您可以尝试以下方法:

Encoding.ASCII.GetString(Encoding.Convert(UnicodeEncoding, ASCIIEncoding, Encoding.Unicode.GetBytes(myString)));
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();
}
尽管如此,我不确定输入有什么问题。你到底在做什么?如果它包含的不仅仅是ascii字符,这有关系吗?而且,我特别不知道你们所说的“它们以粗体印刷”是什么意思。

你们得到的是所谓的字符“全宽形式”。在Unicode中,这些是在代码点U+FF01到U+FF5E处编码的。要从它们那里获取ASCII码点(U+0021到U+007E),必须获取它们的码点并从中减去(0xFF01-0x0021)

ASCII:
全幅表格:

我不会说ASP.NET,但在Java中,代码如下所示:

Encoding.ASCII.GetString(Encoding.Convert(UnicodeEncoding, ASCIIEncoding, Encoding.Unicode.GetBytes(myString)));
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();
}
字符串解码全宽(字符串s){
StringBuilder sb=新的StringBuilder();
对于(int i=0;i

这可能是Unicode“数学粗体”字符您应该从中查看答案

它包括以下方法(摘自Michael Kaplan的博客条目“”):


此路由将删除变音符号(尽可能多),并将其他“奇怪”字符转换为其“正常”形式。

是的!所有答案都非常有用,但基于“规范化”和“KC”,“KD”,我能够确定我只需要调用String.Normalize(NormalizationForm.FormKC)来处理传入的宽字符。谢谢!啊哈,现在我明白了,一开始它看起来像是相对于直字符串的大量额外代码。Normalize()但是你的e'示例是一个很好的例子。既然这看起来更正确,但也更贵,你认为我可以用类似isnormalize()的东西来测试变音符号吗?IsNormalized表示字符串是否在其中一个规范化表单中。如果您担心性能,可以使用CompareOrdinal检查FormD中的字符串是否与原始的不同。请注意,最后一次调用“Normalize(NormalizationForm.FormC)”不会将问题中的字符串减少为“拉丁语”但使用Form.KC会。事实上,如果你不关心非间隔标记,整个shebang可能就是myCrazyString.Normalize(NormalizationForm.KC);嘿,太好了,我已经根据这个问题的反馈调整了我的“字符串清理例程”。我将发布我使用的新代码。