这些Unicode组合字符有什么用,我们如何过滤它们?

กิิิิิิิิิิิิิิิิิิิิก้้้้้้้้้้้้้้้้้้้้ก็็็็็็็็็็็็็็็็็็็็ก็็็็็็็็็็็็็็็็็็็็กิิิิิิิิิิิิิิิิิิิิก้้้้้้้้้้้้้้้้้้้้ก็็็็็็็็็็็็็็็็็็็็กิิิิิิิิิิิิิิิิิิิิก้้้้้้้้้้้้้้้้้้้้กิิิิิิิิิิิิิิิิิิิิก้้้้้้้้้้้้้้้้้้้้ก็็็็็็็็็็็็็็็็็็็็ก็็็็็็็็็็็็็็็็็็็็กิิิิิิิิิิิิิิิิิิิิก้้้้้้้้้้้้้้้้้้้้ก็็็็็็็็็็็็ ็็็็็็็กิิิิิิิิิิิิิิิิิิิิก้้้้้้้้้้้้้้้้้้้้

这些最近出现在Facebook的评论部分。

我们如何消毒呢?

这些unicode字符是什么?

这是一个具有一系列组合字符的angular色 。 因为有问题的组合字符想要超越基本字符,所以它们叠加起来(字面意思)。 比如说

ก้้้้้้้้้้้้้้้้้้้้

( U + 0E01 ),然后是泰语组合字符mai tho ( U + 0E49 )的20个副本。

我们如何消毒呢?

可以预先处理文本,并限制可以应用于单个字符的组合字符的数量,但是这种努力可能不值得奖励。 你需要所有当前字符的数据表,所以你要知道他们是合并还是什么,你需要确保至less允许几个字符,因为一些语言在一个基础上被编写了几个变音符号。 现在,如果你想限制对拉丁字符集的评论,这将是一个更容易的范围检查,但当然这只是一个选项,如果你想限制的意见只有几种语言。 更多信息,代码表等在unicode.org 。

顺便说一句,如果你想知道一些字符是如何组成的,另一个问题就是最近我在JSBin上编写了一个快速又脏的“Unicode Show Me”页面 。 您只需将文本复制并粘贴到文本区域中,即可显示文本所组成的所有代码点(〜字符),并在页面中显示每个字符的链接。 它只适用于U + FFFF和以下的代码点,因为它是用JavaScript编写的,而且在JavaScript中处理U + FFFF以上的字符,所以你必须做比我想做的更多的工作(因为在JavaScript中, “字符” 总是 16位,这意味着对于某些语言来说,字符可以分成两个单独的JavaScript“字符”,但我没有说明这一点),但对于大多数文本来说,这是很方便的。

如果你有一个正确的Unicode支持正则expression式引擎,这是微不足道的消毒这种string。 例如,在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 Crowder最好回答“我们如何消毒”

不过,我认为消毒是一种错误的方法, 克里斯蒂(Cristy)已经把overflow:hidden在CSS元素上。

至less,我就是这样解决的。

好吧,这个我花了一段时间才弄清楚,我认为结合人物来制作扎尔戈的印象只限于这些 。 所以我期望跟随正则expression式赶上怪胎。

 ([\u0300–\u036F\u1AB0–\u1AFF\u1DC0–\u1DFF\u20D0–\u20FF\uFE20–\uFE2F]{2,}) 

它不工作…

问题在于,wiki中的列表并没有涵盖全部的组合字符。

什么给了我一个提示是"ก้้้้้้้้้้้้้้้้้้้้".charCodeAt(2).toString(16) > </s>!

在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>"); } 

通过查看生成的表,你应该能够看到哪些堆栈。 维基上缺less的一个范围是06D6-06DC另一个是0730-0749

更新:

这是更新的正则expression式 ,应该淘汰所有的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,}) 

最难的是识别他们,一旦你做到了 – 有许多解决scheme,包括上面的一些好的。

希望这可以为你节省一些时间。