40

嗯?

上图中的角色是几个月前由Mikko Hyppönen 发布的推文,他是一位以计算机病毒研究和TED计算机安全演讲而闻名的计算机安全专家。关于 SO,我只会发布它的图像,但你明白了。这显然不是您想要在您的网站上传播并吓坏访问者的东西。

经过进一步检查,该字符似乎是一个泰语字母加上超过 87 个变音符号(甚至有限制吗?!)。这让我开始思考安全性、本地化以及如何处理此类输入。我的搜索将我引向Stack 上的这个问题,然后是 Michael Kaplan 关于剥离变音符号的博客文章。在其中,他演示了如何将字符串分解为其“基本”字符(为简洁起见,此处进行了简化):

StringBuilder sb = new StringBuilder();
foreach (char c in "façade".Normalize(NormalizationForm.FormD))
{
    if (char.GetUnicodeCategory(c) != UnicodeCategory.NonSpacingMark)
        sb.Append(c);
}
Response.Write(sb.ToString()); // facade 

我可以看到这在某些情况下会有用,但就用户输入而言,它会删除所有变音符号。正如卡普兰所指出的,删除某些语言中的变音符号可以完全改变单词的含义。这就引出了一个问题:如何在用户输入/输出中允许一些变音符号,但排除其他极端情况,例如 Mikko Hyppönen 的 über 角色?

4

3 回答 3

27
于 2012-08-16T08:38:40.880 回答
2

我想我找到了一个使用NormalizationForm.FormC而不是NormalizationForm.FormD. 根据MSDN

[FormC] 表示使用完整的规范分解对 Unicode 字符串进行规范化,然后如果可能的话,用它们的主要组合替换序列。

我认为这意味着它将字符分解为其基本形式,然后根据一组保持一致的规则重新组合它们。我认为这对于比较目的很有用,但在我的情况下它工作得很好。像ü, é, 和等字符Ä被准确地分解/重组,而虚假字符无法重组,因此保持其基本形式:

在此处输入图像描述

于 2012-08-16T08:34:19.463 回答
0
于 2016-04-20T11:38:34.910 回答