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
在本例中先写0字节,后写abc字节。
我在Lua文档中找不到任何描述这种情况下预期行为的内容。Lua中的大多数其他字符串处理似乎都将零字节视为有效的字符串字符。
这是在OpenWrt上的Lua 5.1.4-8。
特性还是bug?
我认为这是一个bug。
在Lua 5.1和LuaJIT 2.0中,string.format
一次格式化一个项目(使用主机C运行时提供的sprintf
)。然后调用strlen
来更新输出字符串的长度。由于strlen
在null字符处停止,该字符将被覆盖。
这是%s
记录的行为,但对于%c
可能是无意的
在Lua 5.2中修复。我不希望再有5.1版本的更新
在《programming In lua》第2版中。在第2.4章中,有一些背景如下:"Lua中的字符串具有通常的含义:字符序列。Lua是8位干净,其字符串可以包含任何数字代码的字符,包括嵌入的零。这意味着您可以将任何二进制数据存储到一个字符串。"
所以这不是错误