Lua string.format%c与string.char

时间:2013-05-15 14:35:50

标签: lua string.format openwrt

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不会像C sprintf一样截断整个字符串,只是将%c字段折叠为空字符串而不是一个字节的字符串。请注意,在这种情况下,C sprintf写入零字节后跟abc字节。

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

这是关于OpenWrt的Lua 5.1.4-8。

Idiosyncracy或bug?

2 个答案:

答案 0 :(得分:6)

我认为这是一个错误。

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

这是%s的记录行为,但%c

可能是无意的

这在Lua 5.2中得到修复。我不希望再有5.1的更新。

答案 1 :(得分:0)

在“编程在lua”第2版中。在第2.4章中,有一些上下文: “Lua中的字符串具有通常的含义:一系列字符.Lua是 八位清理,其字符串可能包含任何数字代码的字符, 包括嵌入的零。这意味着您可以存储任何二进制数据 一个字符串。 “

所以这不是一个错误