符号显示不正确

时间:2015-12-18 06:49:53

标签: validation browser unicode text-rendering zalgo

符号为:ؤ

这个符号有什么特别之处,它来自哪里?

可以采取哪些措施来验证此类输入?或者甚至更好,这些符号如何正确显示(即不让它们与其他元素重叠)?

5 个答案:

答案 0 :(得分:22)

好吧,因为它似乎并不像我想象的那样微不足道,这是我的答案。

这称为Combining Diacritical Marks

举个例子,您可以直接写ää,这会产生“ä”。

现在你可以搞砸这样的标志:“ä̈̈̈̈̈̈”,我输入了这里:ä̈̈̈̈̈̈

为了保护自己免受这种“unicode”攻击,你可以限制允许互相追逐的unicode字符的数量。我不能给你一个确切的例子,因为你的标签没有提供有关你的服务器端语言的提示。如果您有一个简单的英文网站,您可能会尝试将其限制为ascii chars。但是我不建议这样做,因为我不允许以我的名字签名: - )

我只会将Unicode字符的数量限制在彼此之后。这可能是用正则表达式完成的。

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

答案 1 :(得分:10)

我刚刚将符号复制到SQL Server和Visual Studio,发现符号已转换为

enter image description here

所以它看起来像浏览器无法识别的ْ(看起来像Arabic symbol)符号的组合。

符号为Arabic Hamza symbol

IE也正确解释了相同的符号。

enter image description here

所以看起来有些浏览器无法识别符号。

修改

要验证此类输入通常您可以使用某些排序验证(喜欢使用户只能输入ASCII字符),使用Javascript或PHP等语言,您可以通过这些语言限制用户输入字符根据您的选择。

  

甚至更好,如何正确显示这些符号

如果浏览器无法将符号呈现为您显示的符号,那么作为一种解决方法,您可以对这些字符设置一些限制,例如将它们放在带有overflow:auto的div中,但这不是一个好的解决方案。更好的方法是使用验证脚本。

答案 2 :(得分:7)

奇怪的是,在屏幕上你只会看到一个字符后跟一条从不知名的地方画出的线条。

但是在使用chrome进行检查时,实际上是第一个字符为Unicode 1572的字符,后跟 161 字符,其中的字符为Unicode 1618之后有Unicode (or ASCII code) 32空间。

答案 3 :(得分: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

您可能希望使用meta tag: 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; }

我希望有所帮助。 祝你好运。

答案 4 :(得分: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

阿拉伯语中有很多变音符号:1个hamza(预先组成为上面有hamza的角色)和大约160个重复的sukun变音符号。