这些最近出现在Facebook评论部分。
我们如何进行内容清洗?
这些最近出现在Facebook评论部分。
我们如何进行内容清洗?
这些Unicode字符是怎么回事?
这是一个带有一系列组合字符的字符。因为相关的组合字符想要放在基本字符上面,它们会叠起来(字面意思)。例如:
ก้้้้้้้้้้้้้้้้้้้้
...这是一个 ก(泰文字符 ko kai)(U+0E01),后面跟着20个泰文组合字符 mai tho(U+0E49)。
你可以预处理文本并限制可应用于单个字符的组合字符数量,但这样做可能得不偿失。你需要所有当前字符的数据表,以便知道它们是否是组合字符,以及你需要确保至少允许一些组合字符,因为有些语言是在单个基础字符上写有几个变音符号的。现在,如果你想将评论限制为拉丁字符集,那么这将是一个更容易的范围检查,但当然只有在你想将评论限制为仅涉及几种语言时才是一个选项。更多信息、代码表等请参考unicode.org。我们该如何进行清理?
顺便说一下,如果你想知道某个字符是如何组成的,最近我在JSBin上编写了一个快速而简单的“Unicode Show Me”页面,与另一个问题相关。你只需将文本复制粘贴到文本区域中,它会显示文本由哪些代码点(~字符)组成,并提供类似上面链接的页面来描述每个字符。它仅适用于U+FFFF及以下范围内的代码点,因为它是用JavaScript编写的,要处理JavaScript中超过U+FFFF的字符,你需要做更多的工作(因为在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");
这将打印:
<base><macron><overline><macron><overline>...
。因此,如果您的文本需要多个_不同的_组合字符,则可以通过;而恶意文本仍然可能被构建。 - Jesse Chisholm“如何消毒这个”最好由T.J Crowder以上回答。
然而,我认为消毒不是正确的方法,Cristy 通过在包含元素的CSS上使用overflow:hidden
是正确的解决方案。
至少,这就是我解决它的方式。
好的,这个花了我一些时间才弄明白,我曾认为组合字符以产生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
。([\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,})
([\u0300–\u036F\u1AB0–\u1AFF\u1DC0–\u1DFF\u20D0–\u20FF\uFE20–\uFE2F]{2,})
不起作用。你不觉得叠加Unicode不仅限于维基上的内容很有趣吗?你说的“失去回答的问题”是什么意思?编辑:你可能会觉得在一个三年前的问题中添加答案很奇怪,但由于我花了一些时间来弄清楚为什么这种类型的zalgo有效,我不能让这样的知识浪费掉。下一个人将节省一些时间。 - Matas Vaitkevicius