Lua字符串.格式化%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不会像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位干净,其字符串可以包含任何数字代码的字符,包括嵌入的零。这意味着您可以将任何二进制数据存储到一个字符串。"

所以这不是错误

最新更新