Zalgo文本是如何工作的?

732
我在各种论坛上看到了类似下面的奇怪格式的文本,被称为Zalgo。虽然它很烦人,但它真正困扰我的是它破坏了我对字符应该是什么的概念。我理解的是,一个字符应该沿着一行水平移动,并停留在某个“容器”内。显然,Zalgo文本是垂直移动的,并且似乎没有受到任何空间的限制。
这是Unicode中的一个漏洞/缺陷/利用/黑客吗?这些是具有奇怪属性的单个字符吗?这里发生了什么?
【引用】 Zalgo文本如何工作?

32
谢谢您的请求。http://en.wikipedia.org/wiki/Combining_character可能提供一些线索。Combining character是Unicode字符集中的特殊字符,其作用是与其他字符组合形成一个新字符。这个新字符通常看起来像原始字符与附加符号的组合。例如,字母“e”加上两个点(¨)可以形成字母“ë”。值得注意的是,使用组合字符时,它们不会独立显示,而是与前面的字符合并在一起显示。因此,在对文本进行搜索、排序或比较等操作时,必须正确地处理这些字符。 - Lucas Jones
2
这可能会让你大吃一惊:https://zh.wikipedia.org/wiki/%E6%B0%B4%E5%B9%B3%E6%96%87%E5%AD%97 - Burhan Ali
4
作为必要的参考,https://xkcd.com/1857/。 - mackycheese21
2个回答

452
该文本使用组合字符,也称为组合标记。请参阅Unicode标准中的组合字符(PDF)第2.11节。
在Unicode中,字符呈现不使用简单的字符单元格模型,其中每个字形适合具有给定高度的框中。组合标记可以呈现在基字符上方、下方或内部。
因此,您可以轻松构造一个字符序列,由基字符和“组合上方”标记组成,长度任意,以达到任何所需的视觉高度,假设呈现软件符合Unicode呈现模型。当然,这样的序列没有意义,甚至猴子也能制作它(例如,给定适当驱动程序的键盘)。
而且,您可以混合“组合上方”和“组合下方”标记。
问题中的示例文本以以下方式开始:

40
Unicode能做到这一点,是因为它刻意只符合“字符的实际使用情况”,而期望软件符合Unicode。这就是为什么我们有了像U+1F4A9这样的字符编码。 - Camilo Martin
2
只是为了补充一下,这里有一个组合字符列表,用于在文本上方、下方或穿过文本生成“Zalgo文本”:http://www.zalgotextgenerator.com/unicode - VKK
@CamiloMartin 我不认为我理解你所说的“实际应用”。例如,是否有一种语言,其中带有小T、koronis、逗号和点的H代表一个有意义的文本概念,而不仅仅是“这是一个H,但有一堆任意选择的东西遮盖它”?如果这些装饰中的任何一个被移除或更改,语义是否会真正改变? - Karl Knechtel

290
Zalgo文本之所以能够发挥作用,是因为运用了组合字符。它们是特殊字符,允许修改它前面的字符。 enter image description here 或者
y + ̆ = y̆,实际上是这样的。
y + ̆ = y̆

由于可以将它们一层叠一层地堆放,因此您可以产生以下效果:




y̆̆̆̆̆̆̆̆̆̆̆̆̆̆̆̆̆̆

实际上是:

y̆̆̆̆̆̆̆̆̆̆̆̆̆̆̆̆̆̆

同样的,放置东西在下面也是适用的:


y̰̰̰̰̰̰̰̰̰̰̰̰̰̰̰̆̆̆̆̆̆̆̆̆̆̆̆̆̆̆̆̆̆



实际上是这样的:

y̰̰̰̰̰̰̰̰̰̰̰̰̰̰̰̆̆̆̆̆̆̆̆̆̆̆̆̆̆̆̆̆̆

在Unicode中,欧洲语言和国际音标的组合变音符的主要块是U+0300-U+036F。

点击此处了解更多

使用以下脚本可以生成组合变音符列表(因为链接会不断失效):

for(var i=768; i<879; i++){console.log(new DOMParser().parseFromString("&#"+i+";", "text/html").documentElement.textContent +"  "+"&#"+i+";");}

同时也要检查它们



Mͣͭͣ̾ Vͣͥͭ͛ͤͮͥͨͥͧ̾


3
你会如何打出那个? - Aequitas
7
如果你在询问“ALT”代码,那么你不能这样做,你只需将“y̆̆”粘贴到“纯”的HTML中,浏览器会自动完成它的工作... - Matas Vaitkevicius
2
@barbsan 你好,谢谢你告诉我,我已经用一个生成脚本替换了它们。 - Matas Vaitkevicius
@SergeyA,下划线波浪号(y&#x0330; y̰)是什么意思? - Matas Vaitkevicius
1
这只是Richard的昵称。 - mplungjan
显示剩余8条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接