Kiiiiiiiiiiiiiiiiiiii 该 Keeeeeeeeeeeeeeeeeeee Keeeeeeeeeeeeeeeeeeee Kiiiiiiiiiiiiiiiiiiii 该 Keeeeeeeeeeeeeeeeeeee Kiiiiiiiiiiiiiiiiiiii 该 Kiiiiiiiiiiiiiiiiiiii 该 Keeeeeeeeeeeeeeeeeeee Keeeeeeeeeeeeeeeeeeee Kiiiiiiiiiiiiiiiiiiii 该 Keeeeeeeeeeeeeeeeeeee Kiiiiiiiiiiiiiiiiiiii 该
这些最近在Facebook的注释部分出现了。
我们如何消毒呢?
这是怎么回事这些Unicode字符?
这是一系列的字符组合字符 。 因为有问题的组合字符想去基本字符以上,它们堆起来(直译)。 例如,的情况下,
该
......这是一个ก(泰语字符KO佳 )( U + 0E01其次是泰国组合字符麦寿 (20张) U + 0E49 )。
我们如何消毒呢?
你可以预先处理文本,并限制了可应用于单个字符相结合的字符数,但这种努力可能不值得奖励。 你需要为所有当前字符数据表,所以你就会知道他们是否合并或什么,你需要一定要允许至少有几个,因为某些语言与几个附加符号在一个底座上写。 现在,如果你想限制意见的拉丁字符集,这将是一个更简单的范围检查,但当然,如果你想限制意见只是少数几种语言,这只是一个选项。 更多信息,代码表等在unicode.org 。
顺便说一句,如果你想知道一些字符是如何构成的,另一个问题就在最近我编写了一个快速和肮脏“的Unicode显示我”页上JSBin。 你只要复制并粘贴到文本区域,它显示你所有的文本是由与链接如上面描述每个角色的页面的代码点(〜字符)。 它仅适用于在范围内U + FFFF,并在代码点,因为它是用JavaScript编写,并处理上述U + FFFF在JavaScript中的字符,你必须做的比我想对这个问题做(更多的工作,因为在JavaScript中,一个“人物” 永远是16位,这意味着对于某些语言字符可以在两个独立的JavaScript“人物”被拆分,我没有考虑那个),但它很方便大多数文本...
如果你有不错的Unicode支持正则表达式引擎,是微不足道的消毒这类字符串。 在Perl,例如,你可以从这样的每一个(用户感知)字符删除所有,但第一组合标志:
#!/usr/bin/perl
use strict;
use utf8;
binmode(STDOUT, ':utf8');
my $string = "กิิ ก้้ ก็็ ก็็ กิิ ก้้ ก็็ กิิ ก้้ กิิ ก้้ ก็็ ก็็ กิิ ก้้ ก็็ กิิ ก้้";
$string =~ s/(\p{Mark})\p{Mark}+/$1/g; # Strip excess combining marks
print("$string\n");
这将打印:
他有它的发展,它是,它只是我在烤,它的演变。
“我们怎样才能清理这个”最好是通过上述回答TJ克劳德
不过,我认为消毒是错误的做法,并CRISTY有它的权利与overflow:hidden
在包含CSS元素。
至少,这就是我如何解决它。
确定这一个我花了一段时间才能弄清楚,我是在印象中,组合字符产生zalgo被限于这些 。 所以,我希望下面的正则表达式赶怪胎。
([\u0300–\u036F\u1AB0–\u1AFF\u1DC0–\u1DFF\u20D0–\u20FF\uFE20–\uFE2F]{2,})
它没有工作...
美中不足的是, 名单在维基并不包括全系列组合字符的。
给了我是一个提示领袖什么"ก้้้้้้้้้้้้้้้้้้้้".charCodeAt(2).toString(16)
=“E49”这不是在范围内结合,这难道属于“私用”。
在C#中他们属于UnicodeCategory.NonSpacingMark
和下面的脚本刷新出来:
[Test]
public void IsZalgo()
{
var zalgo = new[] { UnicodeCategory.NonSpacingMark };
File.Delete("IsModifyLike.html");
File.AppendAllText("IsModifyLike.html", "<table>");
for (var i = 0; i < 65535; i++)
{
var c = (char)i;
if (zalgo.Contains(Char.GetUnicodeCategory(c)))
{
File.AppendAllText("IsModifyLike.html", string.Format("<tr><td>{0}</td><td>{1}</td><td>{2}</td><td>A&#{3};&#{3};&#{3}</td></tr>\n", i.ToString("X"), c, Char.GetUnicodeCategory(c), i));
}
}
File.AppendAllText("IsModifyLike.html", "</table>");
}
通过查看表中生成,你应该能够看到哪些效果叠加。 这是在维基缺少一个范围06D6-06DC
另一个0730-0749
。
更新:
下面是更新的正则表达式应该捞出所有zalgo包括那些在“正常”范围绕过。
([\u0300–\u036F\u1AB0–\u1AFF\u1DC0–\u1DFF\u20D0–\u20FF\uFE20–\uFE2F\u0483-\u0486\u05C7\u0610-\u061A\u0656-\u065F\u0670\u06D6-\u06ED\u0711\u0730-\u073F\u0743-\u074A\u0F18-\u0F19\u0F35\u0F37\u0F72-\u0F73\u0F7A-\u0F81\u0F84\u0e00-\u0eff\uFC5E-\uFC62]{2,})
最难位识别它们,一旦你已经这样做了 - 有解决方案,包括上述一些好的众多的。
希望这可以节省一些时间。
文章来源: What's up with these Unicode combining characters and how can we filter them?