什么是嵌入式零?

我正在阅读Lua参考手册,它谈到了“内嵌零”,用“ \0”表示。

当我尝试在Lua控制台中查看它时,它打印出了没有意义的内容:

> print "a \0 b"
a

那么,“内嵌零”是什么?

原文链接 https://stackoverflow.com/questions/8475656

点赞
stackoverflow用户225239
stackoverflow用户225239

在源码字符串文字或字符常量中,空字符通常被表示为转义序列\\0

维基百科 空字符

2011-12-12 14:21:43
stackoverflow用户1441
stackoverflow用户1441

这将类似于在 C 字符串中放置一个 NULL 字符。尽管您的打印输出不显示 b 字符,但其他 Lua 函数应该可以使用字符串的完整长度(不像 C 字符串处理函数只能使用以 NULL 结尾的字符串)。

其中一个用途是使用一个字符串来保存多个由 \0 分隔的值。

```

2011-12-12 14:22:41
stackoverflow用户137317
stackoverflow用户137317

\0 就是一个值为零的字节,没有什么花哨的名称。Lua 字符串只是保持其长度的字节字符串,因此它们可以包含任何字节值,包括零。一些函数将这些字节字符串视为以\0 结尾的 C 字符串,显然 print 函数就是这样处理的。

这意味着在 Lua 中,#s(字符串长度)的时间复杂度是 O(1),而 C 字符串的时间复杂度是 O(n)。应用程序可以使用 Lua 字符串来表示任何字节流,例如 UTF-16 编码的文本或二进制文件内容。

2011-12-12 14:30:00
stackoverflow用户427413
stackoverflow用户427413

每个字符都有其内部数值表示方式,例如 'a' 的码值是 \97。而码值为 \0 的字符并不代表任何可见字符,但在 C 和其他编程语言中,它是一个终止符。

该手册想要明确表明,在 Lua 中,'\0' 不是一个终止符。这也意味着,你可以将任意字节加载到一个字符串中(图像、音频、视频、本地代码等),而不必担心它会在某些库函数处被截断于第一个 '\0'(在 C 中这种情况可能会发生,如果你使用与字符串有关的函数)。

2011-12-12 15:02:51
stackoverflow用户9915018
stackoverflow用户9915018

Lua 5.2 在处理字符串中的 nul 字节时表现良好,而 Lua 5.1 则存在一些问题。 我发现函数 print 在 nul 字节之后会丢弃所有字符。 而函数 string.format 则返回第一个 nul 字符之前的字符串。

Lua 5.2 works well when Lua 5.1 has several problems with nul bytes in the string.
I've found that the function print dischards all characters after the nul byte.
Also the function string.format returns string up to the first nul character.
2018-06-08 15:55:01