Lua string.format%c与string.char

Lua string.format%c与string.char,lua,string.format,openwrt,Lua,String.format,Openwrt,Luastring.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那样在空字节处截断整个字符串,只是将%c字

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的Lua5.1.4-8上

特质还是缺陷?

我认为这是一个缺陷

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

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

这在Lua5.2中是固定的。我不希望在第二版《lua编程》一书中对5.1有更多的更新。在第2.4章中,有如下内容: “Lua中的字符串具有通常的含义:一个字符序列。Lua是 八位clean及其字符串可以包含带有任何数字代码的字符, 包括嵌入的零。这意味着您可以将任何二进制数据存储到 一串。 "


所以这不是一个bug

我将该语句解释为“嵌入的零与任何其他字节一样被处理”。但是
string.format
的文档在这里更相关,因为它声明了此规则的一个例外。请注意,Lua 5.2只修复了%c,而没有修复%s。LuaJIT 2.1对%c和%s都能正确处理此问题。
(%c%s”):格式(0,“abc”):子(1,1)
给出了什么?