不可见字符 - ASCII

91

是否存在任何不可见字符?我查看了谷歌上的不可见字符,得到了许多答案,但我对这些答案并不确定。有没有 Stack Overflow 上的人可以告诉我更多信息?

此外,我查看了 Facebook 上的一个个人资料,并发现该用户没有为其个人资料设置任何名称?这可能吗?是某种数据库问题吗?黑客入侵或其他原因?

当我在互联网上搜索时,我发现200D是带有不可见字符的 ASCII 值。这是真的吗?


4
空格字符是不可见的(0x20):P - Alex Gittemeier
3
在Windows XP中,你可以创建一个没有名称的文件夹,例如他可能会将其命名为hisProfile。按住Alt键并在按住Alt键的同时从数字键盘上输入数字0160。需要注意的是,数字0160应该从数字键盘上输入而不是字符键上方的数字键。 按Enter键后,将创建一个无名称的文件或文件夹。 - Siba Prasad Hota
https://www.compart.com/en/unicode/U+3164 - user5306470
7
我从未见过任何。 - bers
7个回答

147

我刚刚用字符映射得到了这些内容。它们都是使用 Calibri 字体。

编号     名称                 HTML 代码      外观
------  --------------------  ---------   ----------
U+2000  En Quad                      " "
U+2001  Em Quad                      " "
U+2002  En Space                    " "
U+2003  Em Space                    " "
U+2004  Three-Per-Em Space          " "
U+2005  Four-Per-Em Space           " "
U+2006  Six-Per-Em Space            " "
U+2007  Figure Space                " "
U+2008  Punctuation Space          " "
U+2009  Thin Space                  " "
U+200A  Hair Space                  " "
U+200B  Zero-Width Space      ​     "​"
U+200C  Zero Width Non-Joiner ‌     "‌"
U+200D  Zero Width Joiner     ‍     "‍"
U+200E  Left-To-Right Mark    ‎     "‎"
U+200F  Right-To-Left Mark    ‏     "‏"
U+202F  Narrow No-Break Space       " "

7
Calibri和这有什么关系? - gdvalderrama
3
并非每个字体集都拥有每个Unicode符号的定义。举个例子,可以参考这个链接:https://unix.stackexchange.com/q/128276/265870 - D.Kastier
5
U+2800是盲文空白符,表示为"⠀"。 - Miguel Bartelsman
1
我发现还有一些需要清理的字符(例如Word Joiner和OGHAM Space Mark)。这是我的列表(以JSON格式):https://gist.github.com/JamoCA/42c3be286185aff0476d5888f0a819ff - James Moberg

129

11

实际上有一个真正看不见的字符:U+FEFF。 这个字符被称为字节顺序标记,与Unicode 8系统相关。这是个非常令人困惑的概念,可以在这里进行解释。字节顺序标记或BOM简称是一个不占用任何空间的看不见的字符。你可以将下面的字符复制到><之间。

这是该字符:

> <

如何在操作中捕获此字符:

  • 复制><之间的字符,
  • 写一行文本,然后随机将光标放在文本行中
  • 将该字符粘贴到行中。
  • 移到行的开头,按住右箭头键。
您会注意到,当您的光标移到您粘贴字符的位置时,它会暂停约半秒钟。这是因为光标正在通过不可见字符。即使您看不到它,也不能说明它不存在。光标仍然看到您粘贴BOM的那个区域有一个字符,并将穿过它。由于BOM是不可见的,因此光标看起来像是暂停了一会儿。您可以在一个区域内多次粘贴BOM,并重复上述步骤以真正展示其影响。祝好运!
编辑:不幸的是,Stackoverflow不喜欢这个字符。以下是来自w3.org的一个示例:https://www.w3.org/International/questions/examples/phpbomtest.php

6

其他答案是正确的 - 一个字符是否可见取决于你使用的字体。这似乎对我来说是一个相当不错的完整列表,其中包含一些其他列表缺失的真正不可见的字符(甚至不是空格)。

'\u2060', // Word Joiner
'\u2061', // FUNCTION APPLICATION
'\u2062', // INVISIBLE TIMES
'\u2063', // INVISIBLE SEPARATOR
'\u2064', // INVISIBLE PLUS
'\u2066', // LEFT - TO - RIGHT ISOLATE
'\u2067', // RIGHT - TO - LEFT ISOLATE
'\u2068', // FIRST STRONG ISOLATE
'\u2069', // POP DIRECTIONAL ISOLATE
'\u206A', // INHIBIT SYMMETRIC SWAPPING
'\u206B', // ACTIVATE SYMMETRIC SWAPPING
'\u206C', // INHIBIT ARABIC FORM SHAPING
'\u206D', // ACTIVATE ARABIC FORM SHAPING
'\u206E', // NATIONAL DIGIT SHAPES
'\u206F', // NOMINAL DIGIT SHAPES
'\u200B', // Zero-Width Space
'\u200C', // Zero Width Non-Joiner
'\u200D', // Zero Width Joiner
'\u200E', // Left-To-Right Mark
'\u200F', // Right-To-Left Mark
'\u061C', // Arabic Letter Mark
'\uFEFF', // Byte Order Mark
'\u180E', // Mongolian Vowel Separator
'\u00AD'  // soft-hyphen

有一个名为invisible-characters.com的网站已经编制了与您类似的列表。显然,它们之间有相当大的重叠部分,但您的列表有一些它们没有的内容,反之亦然。他们的列表中缺少\u2066到\u2069。相反,您的列表缺少很多项,比如U+034F (连字符)和U+200B (零宽度空格)。尽管如此,他们列表中的一些条目显然不是不可见的(例如U+0020 (空格)和U+200A (偏移空格)),因此我建议使用他们的列表时要小心。 - skomisa

1
关于Unicode中的不可见字符问题,需要更详细的解释。
简短回答 - 有很多。
这里有134个不可见字符 →­؜᠎​‌‍‎‏‪‫‬‭‮⁠⁡⁢⁣⁤⁧⁦⁨⁩← 这是它们的转义ASCII表示:U+00AD U+061C U+180E U+200B U+200C U+200D U+200E U+200F U+202A U+202B U+202C U+202D U+202E U+2060 U+2061 U+2062 U+2063 U+2064 U+2067 U+2066 U+2068 U+2069 U+206A U+206B U+206C U+206D U+206E U+206F U+FEFF U+1D173 U+1D174 U+1D175 U+1D176 U+1D177 U+1D178 U+1D179 U+1D17A U+E0001 U+E0020 U+E0021 U+E0022 U+E0023 U+E0024 U+E0025 U+E0026 U+E0027 U+E0028 U+E0029 U+E002A U+E002B U+E002C U+E002D U+E002E U+E002F U+E0030 U+E0031 U+E0032 U+E0033 U+E0034 U+E0035 U+E0036 U+E0037 U+E0038 U+E0039 U+E003A U+E003B U+E003C U+E003D U+E003E U+E003F U+E0040 U+E0041 U+E0042 U+E0043 U+E0044 U+E0045 U+E0046 U+E0047 U+E0048 U+E0049 U+E004A U+E004B U+E004C U+E004D U+E004E U+E004F U+E0050 U+E0051 U+E0052 U+E0053 U+E0054 U+E0055 U+E0056 U+E0057 U+E0058 U+E0059 U+E005A U+E005B U+E005C U+E005D U+E005E U+E005F U+E0060 U+E0061 U+E0062 U+E0063 U+E0064 U+E0065 U+E0066 U+E0067 U+E0068 U+E0069 U+E006A U+E006B U+E006C U+E006D U+E006E U+E006F U+E0070 U+E0071 U+E0072 U+E0073 U+E0074 U+E0075 U+E0076 U+E0077 U+E0078 U+E0079 U+E007A U+E007B U+E007C U+E007D U+E007E U+E007F 还有更多吗?是的。
ASCII范围内是否存在不可见字符?这取决于字体。

长篇回答 - 准备好了吗?开始!

Unicode标准使任何人都能够用自己的语言阅读和书写。为此,它列出了独特的代码点 (U+十六进制),这些代码点被分类为字母 (D, ž, Dž, ʶ, 愛,), 符号 (+, ∊, ≠, £, ¥, ₪, ҂, ˚, ˟, ˿), 标记 (ם֑֟֯, ী, ◌҉), 分隔符 ( , , , ,  ), 表情符号 (,) 等等。ASCII/基本拉丁文是表格的起点,每次更新都会添加更多的代码点。

仅列出字符的唯一数字是不够的。字符可以根据上下文改变其形状或改变句子。为了支持这一点,每个代码点都带有一个属性列表。这些属性可能定义宽度 (AA)、在句子中的作用 (-“.)、方向 (cכ) 等等。

大多数不可见字符都具有属性General_Category=Format (其他答案中还包括空格)。这些字符对单词/句子起到支持作用。以下是一些示例:

  • 常规标点符号块 - 是某些书写系统和表情符号中不可或缺的不可见字符。常见的有零宽连接器(U+200D)、零宽非连接器(U+200C)和单词连接器(U+2060)。
  • 显式双向格式化字符 - 12个不可见字符用于强制约束句子的不同方向,帮助展示给超过3亿使用从右到左书写语言的人们,例如希伯来语或阿拉伯语。
  • 标签 - 97个不可见字符镜像了ASCII(去掉E就是ASCII范围内的字符)。这些字符被用作表情符号修饰符和数字签名,以证明谁复制了你的文本。

这些都涉及到利用不可见字符进行同形攻击/视觉欺骗。有时候是无害的,比如不可见的名字和标题,但在许多情况下,它们被恶意使用。例如,U+202E是一个不可见字符,它已经造成了数十年的危害

最后一点,还有另一种使用字体制作不可见字符的方法。字体是存储字形(字符图片)的文件,用于呈现字符的外观。如果字体不包含某个码点的字形,则显示替代/替换字符(例如�、□)。但是,如果字体包含某个码点的透明字形,则该字符就是不可见的,只有在该字体中显示时才是不可见的。这是在ASCII范围内拥有不可见字符的唯一方式(例如,您能看到→``← U+000C 换页符吗?)

希望您找到这个解释有用,并且可以更经常地检查字符串中的不可见字符


0

是的,您可以使用一些HTML代码/符号来使用Facebook上的隐形或空白名称

方法1:

在您的名字字段中复制并粘贴没有括号的(ﹺ                         ﹺ)符号。

方法2:

点击编辑名称。现在在名字的第一个和最后一个位置上复制并粘贴以下符号。

ՙՙ ՙՙ

-1
一个不可见字符是,或称U+200b

这只是其中之一。这个答案到底对其他三个已有的答案有什么补充呢? - Sebastian Simon

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