符号未正确显示

30

这个符号是: ؤْْْْْْْْْْْْْْْْْْْْْْْْْْْْْْْْْْْْْْْْْْْْْْْْْْْْْْْْْْْْْْْْْْْْْْْْْْْ

这个符号有何特别之处,它从哪里来?

如何验证此类输入?或者更好的方法是如何正确显示这些符号(即不让它们重叠在其他元素上)?


5
@DrixsonOseña:我想这就是OP所询问的!它也显示在我的屏幕上。 - Rahul Tripathi
8
由于这个符号的奇怪行为,9GAG上的人们已经使用它一段时间了。我试图在谷歌上找到更多关于它的信息,但谷歌返回了400错误。所以我不得不在这里发布这个问题。 - chaosifier
6
谷歌回复了一个400错误,这本身就很有趣!我想知道为什么会发生这种情况。 - Krease
7
很美。 - ASA
3
相关:Zalgo文本是如何工作的? - CodesInChaos
显示剩余8条评论
5个回答

20

嗯,因为似乎对其他人来说并不像我想象的那么简单,所以这是我的答案。

这被称为组合变音符号

举个例子,你可以直接写一个ä,也可以写成ä,结果是 "ä"。

现在你可以随意玩弄这些符号,比如这里:"ä̈̈̈̈̈̈",这里我输入了:ä̈̈̈̈̈̈

为了保护自己免受这种“Unicode”攻击,您可以限制允许每个字符后面出现的Unicode字符的数量。由于您的标记没有提供关于服务器端语言的提示,因此我无法给出确切的示例。如果您有一个纯英语网站,您可以尝试将其限制为仅使用ASCII字符。但是我不推荐这样做,因为那样我就不能用我的名字签名了:-)

我只会限制每个Unicode字符之后的数量。这可能可以通过正则表达式实现。

如果您只想避免Unicode字符“突破”它们的容器,请尝试使用style="overflow:auto",这似乎限制了它的呈现方式。


3
我之前没有意识到这在其他浏览器中显示不同。如果 Rahul Tripathi 是正确的,这个特殊字符是一个阿拉伯字符(我没有去检查这个特殊字符),我可以想象一些浏览器/操作系统没有安装对阿拉伯字符的支持,所以我猜测这是一个错误或缺失的支持。 - rekire
1
由于我有更多问题,还有一些成员说这个问题与编程无关,所以我不得不更新问题并取消您的答案。对造成的不便表示抱歉,我应该在一开始就包含所有信息。 - chaosifier
1
@chaosifier,现在你可以在我的答案中找到解决方案了 :) - rekire
1
@chaosifier 我不使用Facebook,所以不清楚。但是,“一二三”的编辑(我猜这是123) 给了你一个提示,将其放入一个带有overflow:auto的div中。 - rekire
2
@rekire,这个方法非常有效。我认为你可以把它包含在你的答案中。我已经回滚了你对问题所做的更改,以便让其他人看到问题。非常感谢你的回答,真的很感激。 - chaosifier
显示剩余2条评论

8

我刚刚将该符号复制到SQL Server和Visual Studio中,发现该符号被转换为:

enter image description here

所以看起来是由于 ْ 的组合(看起来像一个阿拉伯符号)使得浏览器无法识别。

该符号是阿拉伯Hamza符号

同样的符号在IE中被正确解释。

enter image description here

因此,一些浏览器可能无法识别该符号。

编辑:

通常,您可以使用一些验证方式(例如限制用户只输入ASCII字符),如Javascript或PHP等语言来验证这种输入。通过这些方式,您可以根据自己的选择限制用户输入字符。

甚至更好的方法是如何正确显示这样的符号?

如果浏览器无法呈现您所显示的符号,则可以使用一些解决方法,例如将它们放在具有overflow:auto属性的div中,但这不是一个好的解决方案。更好的方法是使用验证脚本。


1
你为什么认为IE是正确的,而Firefox(产生该行)是错误的?我不是阿拉伯语专家,但我的第一个猜测会相反。这行看起来像是堆叠组合标记的逻辑结果。 - CodesInChaos

5

屏幕上只会显示一个字符,后面跟着一条从无处来的线,这很奇怪。

但是在使用Chrome进行检查时,实际上它是由第一个字符具有Unicode 1572,后面跟着161个绘制线条的字符,具有Unicode 1618之后还有一个空格,其Unicode(或ASCII代码)为32


"(Unicode) code point",不是“ASCII code”。 - Sebastian Negraszus
真但有限。1572和1618是ASCII代码(十进制系统),如果您将这两个数字转换为十六进制,您将分别得到624和652。现在使用&#x<HexCode>;,您将看到魔法。所以&#x624;是Unicode到你在问题中看到的第一个字符,而&#x652;是Unicode到其余的161个字符... :D - Sachin
4
ASCII和Unicode与十进制和十六进制无关,ASCII是一个7位字符集,因此最大的代码点是127;没有“ASCII代码”(代码点)1572。您谈论的是另一个字符集Unicode,因此术语“ASCII”不正确。 - Sebastian Negraszus
是的,这是正确的。Unicode是ASCII的超集。我已阅读 https://dev59.com/mGIk5IYBdhLWcg3wguX-#19212345 ... 感谢纠正我。 - Sachin

2
我不确定在JavaScript中解析您的符号是否有帮助,但这里有一个可以做到的脚本:
var text = 'your symbol goes here',
regex1 = /(?:[\u0624|\u0652])/g,
result;
// note that the symbol comprises of the letter and the repeated diacritics;
// to remove the symbol completely: 
result = text.replace( regex1, '');

这是一种查看符号中包含的字符类型以及这些字符如何使其看起来非常奇怪的方法(它使用的是JavaScript正则表达式):

https://regex101.com/r/yW4aM8/3

你可能想要使用标签:charset=UTF-8来在所有浏览器上正确呈现整个符号,而不仅仅是在IE上尝试。我会说,你的符号看起来奇怪的唯一原因是因为变音符(重复字符)没有被正确使用,否则,所包含的字符都是合法的。如果这个符号只是某人试图误用表单输入或其他东西来实现相同的效果,我也不会感到惊讶。

该符号使用纯阿拉伯字符,你需要知道的是,该语言字符的范围在Unicode中如下(JavaScript正则表达式),并且可以在unicode.org上获得:

/[\u0600-\u06FF]/g

/[\u0600-\u06FF]/g.exec( ‘text here’ );

// it's advised that you wrap the Arabic words in spans to control and show them correctly, do the following:
'text includes arabic words'.replace(/(?:([\u0600-\u06FF]+))/g, '<span class="xyz">$1</span>';

"并且CSS将是:"
.xyz { unicode-bidi: bidi-override; }

希望这能有点帮助。 祝好运。

1
谢谢啊,兄弟。非常有帮助。 - chaosifier

0
$ echo -n ؤْْ | recode utf8..dump
UCS2   Nem   Descripción

0624   wH    arabic letter waw with hamza above
0652   0+    arabic sukun
0652   0+    arabic sukun
0652   0+    arabic sukun
[...lots of repeated lines...]
0652   0+    arabic sukun

这是带有许多变音符号的阿拉伯文 waw (w):1 个 hamza(预组合为带有上方 hamza 的字符 waw)和约 160 个重复的 sukun 变音符号。


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