【发布时间】:2015-03-12 18:24:53
【问题描述】:
你们中的许多人可能已经看到“巨魔”在社交媒体网站、论坛或 youtube 等视频流网站上发布奇怪的字符,从而弄乱了整个网页。
附上一个示例,这是我从 Instagram 捕获的图像,显示用户发布的评论扰乱了整个评论部分。
这怎么可能?为什么会这样?我们如何才能防止此类事情在我们的网站上发生?
【问题讨论】:
标签: html string unicode encoding
你们中的许多人可能已经看到“巨魔”在社交媒体网站、论坛或 youtube 等视频流网站上发布奇怪的字符,从而弄乱了整个网页。
附上一个示例,这是我从 Instagram 捕获的图像,显示用户发布的评论扰乱了整个评论部分。
这怎么可能?为什么会这样?我们如何才能防止此类事情在我们的网站上发生?
【问题讨论】:
标签: html string unicode encoding
这怎么可能?
Unicode 允许以两种方式使用变音符号。
第一种是“组合”形式,其中组合字母和变音符号只有一个字符,例如 U+00E9 Latin Small Letter E with Acute é。
第二种是“分解”形式,其中您有一个基本字母字符,然后是一个单独的“组合变音”字符。文本处理器和/或字体将这些字符的组合呈现为一个字素,例如 U+0065 拉丁小写字母 E 后跟 U+0301 Combining Acute é。这样做的优点(可以说是缺点)是您可以编写没有组合字符的组合(通常是因为它们从未在任何真实语言中使用过),例如x́。
允许在一个字母上使用多个组合变音符号,因为有些语言在一个字母上使用多个重音(以及其他组合字符的技巧,例如韩语 Jamo 和藏语连接字母)。可以使用多少个组合字符来组成一个字素没有固有的限制。
许多文本处理器会尝试通过将多个组合变音符号堆叠在一起(以及在另一个方向,用于“下方”重音符号)来布置多个组合变音符号。通常,这是尝试显示使用的字体没有特定字形的多重重音字母的合理方法。但这确实意味着您可以发疯并使用荒谬的变音符号来装饰正常文本行之外的方式。
我们如何防止此类事情在我们的网站上发生?
简单的解决方案是使用 CSS overflow: hidden 将每个评论放在自己的块中,这样它们就无法转义到其他内容。
另一种可能性是过滤多个组合字符序列的输入。例如,您可以使用正则表达式删除:
\p{M}{9,}
as 8 是目前在自然语言中已知的组合器中的longest sequence。如果您只关心简单的字母,您可能会尝试使用较低的数字。为此,您需要一个支持 Unicode 字符类 (\p) 的正则表达式引擎,而某些语言本身不具备这些字符类。如果您的语言没有此功能,但您确实可以访问 Unicode 数据库(例如 Python 中的 unicodedata),您可以手动遍历字符以查找具有 M 字符类的字符。
【讨论】: