有没有办法将空字节(ASCII 0x00)复制到 Windows 剪贴板?

有没有办法将空字节(ASCII 0x00)复制到 Windows 剪贴板?

在 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),而程序必须以不同的方式理解这些格式。

相关内容