什么';这些Unicode组合字符是什么?我们如何过滤它们?

什么';这些Unicode组合字符是什么?我们如何过滤它们?,unicode,sanitize,combining-marks,zalgo,Unicode,Sanitize,Combining Marks,Zalgo,กิิิิิิิิิิิิิิิิิิิิ ก้้้้้้้้้้้้้้้้้้้้ ก็็็็็็็็็็็็็็็็็็็็ ก็็็็็็็็็็็็็็็็็็็็ กิิิิิิิิิิิิิิิิิิิิ ก้้้้้้้้้้้้้้้้้้้้ ก็็็็็็็็็็็็็็็็็็็็ กิิิิิิิิิิิิิิิิิิิิ ก้้้้้้้้้้้้้้้้้้้้ กิิิิิิิิิิิิิิิิิิิิ ก้้้้้้้้้้้้้้้้้้้้ ก็็็็็็็

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

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

我们怎样才能消毒呢

这些unicode字符是怎么回事

那是一个有一系列故事的角色。因为所讨论的组合字符要高于基本字符,所以它们(按字面意思)堆叠起来。例如,

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

…这是一个ก (泰文字符ko kai)()后接20份泰文组合字符mai tho()

我们怎样才能消毒呢

您可以对文本进行预处理,并限制可应用于单个字符的组合字符数,但这样做可能不值得。您需要所有当前字符的数据表,以便知道它们是组合还是什么,并且您需要确保至少允许一些字符,因为有些语言是在一个基础上使用多个变音符号编写的。现在,如果您想将注释限制为拉丁字符集,这将是一个更容易的范围检查,但当然,如果您想将注释限制为几种语言,这只是一个选项。更多信息、代码表等,请访问

顺便说一句,如果你想知道某个角色是如何组成的,最近我在JSBin上写了一个问题。您只需将文本复制并粘贴到文本区域中,它就会向您显示文本所包含的所有代码点(~个字符),以及上面描述每个字符的页面链接。它只适用于U+FFFF和U+FFFF以下的代码点,因为它是用JavaScript编写的,要在JavaScript中处理U+FFFF以上的字符,您需要做的工作比我想做的更多(因为在JavaScript中,一个“字符”始终为16位,这意味着对于某些语言,一个字符可以拆分为两个单独的JavaScript“字符”,我没有对此进行说明),但对于大多数文本来说,它非常方便…

上面的回答是“我们如何清理这个”最好

然而,我认为清理是错误的方法,并且在包含css的元素上使用
overflow:hidden
是正确的


至少,我是这样解决的。

如果你有一个支持Unicode的正则表达式引擎,那么清理这种字符串就很简单了。例如,在Perl中,可以从每个(用户感知的)字符中删除除第一个组合标记以外的所有字符,如下所示:

#/usr/bin/perl
严格使用;
使用utf8;
binmode(标准输出“:utf8”);
我的$string=”กิิ ก้้ ก็็ ก็็ กิิ ก้้ ก็็ กิิ ก้้ กิิ ก้้ ก็็ ก็็ กิิ ก้้ ก็็ กิิ ก้้";
$string=~s/(\p{Mark})\p{Mark}+/$1/g;#去除多余的组合标记
打印(“$string\n”);
这将打印:


กิ ก้ ก็ ก็ กิ ก้ ก็ กิ ก้ กิ ก้ ก็ ก็ กิ ก้ ก็ กิ ก้ 好吧,这一次我花了一段时间才弄明白,我的印象是,组合角色来制作zalgo是可行的。所以我希望能抓住那些怪胎

([\u0300–\u036F\u1AB0–\u1AFF\u1DC0–\u1DFF\u20D0–\u20FF\uFE20–\uFE2F]{2,})
但它不起作用

问题是,它没有涵盖所有组合字符

给我一个提示的是
”ก้้้้้้้้้้้้้้้้้้้้“.charCodeAt(2).toString(16)
=”e49“,在不在组合范围内的情况下,它属于“专用”

在C#中,它们属于
UnicodeCegory.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>");
    }
一旦你做到了这一点,最难的一点就是识别它们——有很多解决方案,包括上面提到的一些好的解决方案


希望这能为您节省一些时间。

您以前没有问过这个问题吗?(诚实的问题)。这些绝对不是我为什么要投票?这是一个与编程相关的问题,因为我想知道如何清理这类输入,这样我网站上的评论部分就不会成为13岁孩子的游乐场了。。。กิิิิิิิิิิิิิิิิิิิิ ก้้้้้้้้้้้้้้้้้้้้ ก็็็็็็็็็็็็็็็็็็็็ ก็็็็็็็็็็็็็็็็็็็็ กิิิิิิิิิิิิิิิิิิิิ ก้้้้้้้้้้้้้้้้้้้้ ก็็็็็็็็็็็็็็็็็็็็ กิิิิิิิิิิิิิิิิิิิิ ก้้้้้้้้้้้้้้้้้้้้ กิิิิิิิิิิิิิิิิิิิิ ก้้้้้้้้้้้้้้้้้้้้ ก็็็็็็็็็็็็็็็็็็็็
([\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,})