上图所示的字符是计算机安全专家Mikko Hyppönen在几个月前发布的,该人以从事计算机病毒工作和TED talks在计算机安全方面的工作而著称。关于SO,我只会发布它的图片,但是您会明白的。显然,这不是您想要在您的网站上传播并吓倒访问者的东西。
经进一步检查,该字符似乎是泰语字母,再加上87个变音符号(甚至还有限制吗?!)。这让我开始思考安全性,本地化以及如何处理这种输入。我的搜索将我带到Stack上的this question上,然后是Michael Kaplan的stripping diacritics上的博客文章。在其中,他演示了如何将字符串分解成其“基本”字符(为简洁起见在此进行了简化):
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
我可以看到这在某些情况下会很有用,但就用户输入而言,它将消除所有变音符号。正如Kaplan所指出的,删除某些语言中的变音符号可以完全改变单词的含义。这就引出了一个问题:一个如何允许用户输入/输出中使用一些变音符号,却不包括其他一些极端情况,例如MikkoHyppönen的über角色?
最佳答案
本质上不是Unicode。 UAX-15中存在“流安全”格式的概念,该格式设置了30个组合器的限制...一般而言,不能保证Unicode字符串是流安全的,但是可以肯定地将其视为Unicode的标志不想标准化需要更长字素簇的新字符。
30还很糟糕。已知的最长的自然语言字素簇是藏基Hakṣhmalawarayaṁ(基数为1加8个组合器),因此,现在将其标准化为NFD并禁止连续超过8个组合器的任何序列都是合理的。
如果您只关心西欧通用语言,则可以将其降低到2种。因此有可能在两者之间折衷。
关于c# - 如何防止变音符号,例如Zalgo文字,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/11978912/