什么';这些Unicode组合字符是什么?我们如何过滤它们?
กิิิิิิิิิิิิิิิิิิิิ ก้้้้้้้้้้้้้้้้้้้้ ก็็็็็็็็็็็็็็็็็็็็ ก็็็็็็็็็็็็็็็็็็็็ กิิิิิิิิิิิิิิิิิิิิ ก้้้้้้้้้้้้้้้้้้้้ ก็็็็็็็็็็็็็็็็็็็็ กิิิิิิิิิิิิิิิิิิิิ ก้้้้้้้้้้้้้้้้้้้้ กิิิิิิิิิิิิิิิิิิิิ ก้้้้้้้้้้้้้้้้้้้้ ก็็็็็็็็็็็็็็็็็็็็ ก็็็็็็็็็็็็็็็็็็็็ กิิิิิิิิิิิิิิิิิิิิ ก้้้้้้้้้้้้้้้้้้้้ ก็็็็็็็็็็็็็็็็็็็็ กิิิิิิิิิิิิิิิิิิิิ ก้้้้้้้้้้้้้้้้้้้้ 这些最近出现在facebook的评论部分 我们怎样才能消毒呢 这些unicode字符是怎么回事 那是一个有一系列故事的角色。因为所讨论的组合字符要高于基本字符,所以它们(按字面意思)堆叠起来。例如, ก้้้้้้้้้้้้้้้้้้้้ …这是一个ก (泰文字符ko kai)()后接20份泰文组合字符mai tho() 我们怎样才能消毒呢 您可以对文本进行预处理,并限制可应用于单个字符的组合字符数,但这样做可能不值得。您需要所有当前字符的数据表,以便知道它们是组合还是什么,并且您需要确保至少允许一些字符,因为有些语言是在一个基础上使用多个变音符号编写的。现在,如果您想将注释限制为拉丁字符集,这将是一个更容易的范围检查,但当然,如果您想将注释限制为几种语言,这只是一个选项。更多信息、代码表等,请访问 顺便说一句,如果你想知道某个角色是如何组成的,最近我在JSBin上写了一个问题。您只需将文本复制并粘贴到文本区域中,它就会向您显示文本所包含的所有代码点(~个字符),以及上面描述每个字符的页面链接。它只适用于U+FFFF和U+FFFF以下的代码点,因为它是用JavaScript编写的,要在JavaScript中处理U+FFFF以上的字符,您需要做的工作比我想做的更多(因为在JavaScript中,一个“字符”始终为16位,这意味着对于某些语言,一个字符可以拆分为两个单独的JavaScript“字符”,我没有对此进行说明),但对于大多数文本来说,它非常方便…上面的回答是“我们如何清理这个”最好 然而,我认为清理是错误的方法,并且在包含css的元素上使用什么';这些Unicode组合字符是什么?我们如何过滤它们?,unicode,sanitize,combining-marks,zalgo,Unicode,Sanitize,Combining Marks,Zalgo,กิิิิิิิิิิิิิิิิิิิิ ก้้้้้้้้้้้้้้้้้้้้ ก็็็็็็็็็็็็็็็็็็็็ ก็็็็็็็็็็็็็็็็็็็็ กิิิิิิิิิิิิิิิิิิิิ ก้้้้้้้้้้้้้้้้้้้้ ก็็็็็็็็็็็็็็็็็็็็ กิิิิิิิิิิิิิิิิิิิิ ก้้้้้้้้้้้้้้้้้้้้ กิิิิิิิิิิิิิิิิิิิิ ก้้้้้้้้้้้้้้้้้้้้ ก็็็็็็็
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,})