我有一个 WebForm 搜索页面,偶尔会受到国际访问者的欢迎。当他们输入文本时,它似乎是纯 ASCII az, 0-9 但它们以粗体打印,我的“是这个文本”逻辑无法处理输入。ASP.NET 中是否有任何简单的方法可以将等同于 AZ、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();
}
它似乎是纯 ASCII az, 0-9 但它们以粗体打印
这可能是 Unicode“数学粗体”字符。但更可能是“全角”字符 abcdefghijkllmnopqrstuvuvxyz0123456789。(这些在东亚字符编码中很常见:“全角”是指与汉字/汉字字符的宽度相同。)
要将任一集合转换为 ASCII,请使用Unicode 规范化形式 KC 或 KD。
你应该看看这个问题的答案。
它包括以下方法(来自 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
,因为é
实际上是从e
and´
字符构建的。
这´
是一个“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));
}
此路由将删除变音符号(尽可能多地),并将其他“奇怪”字符转换为它们的“正常”形式。
你可以尝试这样的事情:
Encoding.ASCII.GetString(Encoding.Convert(UnicodeEncoding, ASCIIEncoding, Encoding.Unicode.GetBytes(myString)));
虽然,我不确定输入的问题是什么。你到底在做什么?如果它包含的不仅仅是 ascii 字符,这有关系吗?而且,我特别不知道您所说的“它们以粗体打印”是什么意思。