如何在 Zsh 中创建包含无效 unicode 字符的字符串?

如何在 Zsh 中创建包含无效 unicode 字符的字符串?

出于某些测试目的,我需要一个包含无效 unicode 字符的字符串。如何在 Zsh 中创建这样的字符串?

答案1

我假设您指的是 UTF-8 编码的 Unicode 字符。

这取决于你的意思无效的

invalid_byte_sequence=$'\x80\x81'

这是一个字节序列,其本身在 UTF-8 编码中无效(UTF-8 编码字符中的第一个字节始终具有两个最高位集)。不过,该序列可以在字符的中间看到,因此一旦连接到另一个无效序列(例如 ),它最终可能会形成一个有效序列$'\xe1'$'\xe1'或者$'\xe1\x80'它们本身也是无效的,并且可以被视为被截断的字符。

other_invalid_byte_sequence=$'\xc2\xc2'

0xc2 字节将开始一个 2 字节字符,并且 0xc2 不能位于 UTF-8 字符的中间。因此,在有效的 UTF-8 文本中永远找不到该序列。相同的 for$'\xc0'$'\xc1'which 是从未出现在 UTF-8 编码中的字节。

对于\uXXXX\UXXXXXXXX序列,我假设当前区域设置的编码是 UTF-8。

non_character=$'\ufffe'

这是当前指定的 66 个之一非字符

not_valid_anymore=$'\U110000'

Unicode 现在限制为最大 0x10FFFF 的代码点。 UTF-8 编码最初设计为覆盖 0x7FFFFFFF(perl还支持达到 0xFFFFFFFFFFFFFFFF 的变体),现在通常也仅限于此。

utf16_surrogate=$'\ud800'

代码点 0xD800 到 0xDFFF 是为 UTF16 编码保留的代码点。所以这些代码点的UTF-8编码是无效的。

现在,在最新版本的 Unicode 中,大多数剩余的代码点仍然没有分配。

unassigned=$'\u378'

较新版本的 Unicode 附带了指定的新字符。例如 Unicode 8.0(2015 年 6 月发布)

相关内容