2013-05-15 110 views
3

Lua string.format("%c", value)應該等於string.char(value)Lua string.format%c與string.char

字符值爲零時似乎不是。

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 or bug?

+0

什麼'(」 %C%S「):格式(0, 」ABC「): sub(1,1)'give? – Eric

回答

6

我認爲這是一個錯誤。

在Lua中5.1和2.0 LuaJIT,string.format格式之一項目在時間(使用由主機C運行時所提供的sprintf)。它然後調用strlen更新輸出的字符串的長度。由於strlen在空字符處停止,因此該字符將被覆蓋。

這是記錄行爲%s,但可能無意爲%c

這是固定在Lua 5.2。我不希望對5.1有更多的更新。

+1

請注意,Lua 5.2僅修復%c,但不修復%s。 LuaJIT 2.1正確處理** ** ** c和%s **。 –

0

在「lua編程」第2版中。在2.4章節中,有一些如下所示的內容: 「Lua中的字符串具有通常的含義:一系列字符.Lua爲8位清除,其字符串可能包含任何數字代碼的字符, 包括嵌入的零。這意味着,你可以任意的二進制數據存儲到 字符串 「

所以這是不是一個錯誤

+0

我將該語句解釋爲「嵌入的零被視爲與其他字節一樣」。但是'string.format'的文檔在這裏更加相關,因爲它聲明瞭這個規則的一個例外。 – finnw