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?
答案 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是 八位清理,其字符串可能包含任何数字代码的字符, 包括嵌入的零。这意味着您可以存储任何二进制数据 一个字符串。 “
所以这不是一个错误