Lua中的string.format %c与string.char比较。

Lua中的string.format(“%c”,value)应该等同于string.char(value)吗?

当字符值为零时,似乎不是这样。

string.format( "%c", 0 ):len()

返回0

string.char( 0 ):len()

返回1

更奇怪的是,

string.format( "%c%s", 0, "abc" ):len()

返回3; 对于%c的任何其他非零模256值,返回4,因此string.format没有像Csprintf那样在null字节处截断整个字符串,只是将%c字段收缩为空字符串而不是单字节字符串,请注意,在这种情况下,Csprintf会写入零字节,然后是abc字节。

我在Lua文档中找不到描述此情况下预期行为的任何内容。Lua中的大多数其他字符串处理似乎将零字节视为有效的字符串字符。

这是在OpenWrt上的Lua 5.1.4-8上。

奇怪还是错误?

点赞
用户12048
用户12048

我认为这是一个 bug。

在 Lua 5.1 和 LuaJIT 2.0 中,string.format 每次格式化一项(使用主机 C 运行时提供的 sprintf),然后调用 strlen 来更新输出字符串的长度。因为 strlen 会停止于空字符,所以该字符将被覆盖。

这对于 %s 是有文档说明的行为,但对于 %c 可能是无意的。

这在 Lua 5.2 中已经修复。我不会期望有任何关于 5.1 的更多更新。

2013-05-15 15:17:02
用户1846911
用户1846911

《Lua 程序设计》第二版中的第 2.4 章节中有一些内容,如下所示:

“Lua 中的字符串与一般的含义相同:一串字符。Lua 是八位清洁的,它的字符串可以包含任何数字代码,包括嵌入的零。这意味着你可以将任何二进制数据存储到一个字符串中。”

所以这不是一个 Bug。

2013-05-16 05:54:04