在 Windows 上,空字节 (ASCII 0x00) 似乎无法复制(Ctrl+C 可复制)。为了演示这一点,请打开浏览器的开发控制台并执行console.log('a\x00b')
。如果您尝试在 Windows 8 机器上复制粘贴生成的字符串(可能还有其他版本的 Windows),您会发现只有 被a
复制。\x00
和它后面的所有内容都会被忽略。
有没有办法复制包含空字节的整个字符串?剪贴板甚至可以保存空字节吗?
(辅助问题:为什么无法复制空字节吗?例如,这是否与安全有关,还是只是 Windows 的愚蠢行为?)
答案1
不可以,您不能将嵌入空字符的文本放入剪贴板。让我们看看标准 Windows 剪贴板格式列表有几种格式可以保存通常被理解为文本的内容:
CF_TEXT
(1)CF_OEMTEXT
(7)CF_UNICODETEXT
(13)
每一个定义中都有这句话:
空字符表示数据的结束。
现在,CF_UNICODETEXT
将其数据保存为 UTF-16LE,因此很可能会产生一些空值字节,但空字符(基本上是连续两个空字节)仍将结束字符串。
我们只能推测为什么剪贴板文本中不允许使用空字符,但很可能只是因为 Windows 中最常用的字符串处理函数假设空字符表示结束。知道字符串结束位置的唯一其他方法是在其前面加上其长度。
您可以将图形保存在剪贴板上,即使它们可能具有空字节,因为它们以不同的剪贴板格式传递(例如CF_BITMAP
),而程序必须以不同的方式理解这些格式。