搞砸网页中的人物(特别是社交媒体)

时间:2015-01-14 14:23:31

标签: html string unicode encoding

你们中的许多人可能已经看到“巨魔”发布了奇怪的角色,这些角色会在社交媒体网站,论坛或视频流网站(例如youtube)上弄乱整个网页。

附上一个示例,我从Instagram捕获的图像,显​​示用户发布的评论会混淆整个评论部分。

Instagram comment section

这样的事情怎么可能?为什么会这样?我们怎样才能防止这样的事情发生在我们的网站上?

1 个答案:

答案 0 :(得分:3)

  

这样的事情怎么可能?

Unicode允许以两种方式使用变音符号。

第一种是'组合'形式,其中有一个字母用于组合字母和变音符号,例如U + 00E9拉丁文小写字母E和急性é

第二种是'分解'形式,你有一个基本字母的字符,然后是一个单独的'组合变音'字符。文本处理器和/或字体将这些字符的组合呈现为一个字素,例如U + 0065拉丁字母E,然后是U + 0301组合急性。这种优势(并且可以说是劣势)是你可以编写没有组合字符的组合(通常是因为它们从未在任何真实语言中使用过),例如

允许在单个字母上使用多个组合变音符号,因为有些语言在字母上使用多个重音(以及其他使用组合字符的技巧,如韩语Jamo和藏语加入字母)。可以使用多少组合字符来制作单个字素没有固有的限制。

许多文本处理器会试图通过将它们叠加在一起(并且在另一个方向上,用于“下方”重音)来布置多个组合变音符号。一般来说,这是一种合理的方法,试图显示一个乘法重音的字母,使用的字体没有特定的字形。但这确实意味着你可以疯狂并使用荒谬的变音数来装饰正常文本行之外的方式。

  

我们怎样才能防止这样的事情发生在我们的网站上?

简单的解决方案是将每个注释放在CSS overflow: hidden的自己的块中,这样它们就无法转移到其他内容。

另一种可能性是过滤多个组合字符序列的输入。例如,使用正则表达式,您可以删除:

\p{M}{9,}

因为8是目前以自然语言已知的longest sequence组合器。如果你只关心简单的字母表,你可以尝试更低的数字。为此,您需要一个支持Unicode字符类(\p)的正则表达式引擎,这些语言本身并不具备。如果您的语言没有这个但您可以访问Unicode数据库(例如Python中的unicodedata),您可以手动遍历查找M个字符类的字符。