Lua 中涉及包含双引号和/或单引号的字符串问题 - string.format("%q") 在字符串末尾添加 \13 后缀

在 Lua 中, 我正在读取一个文本文件,其中的每行可能包含单引号或双引号,比如: "L'habitude commence comme un fil de soie et devient vite un câble d'acier" - 西班牙谚语

这些行被用作如下方式:

local cmd = 'zenity --question --no-wrap  --title "pause" --text ' .. string.format("%q", quote)
print (cmd)
local retVal = os.execute(cmd)

一切正常,但在字符串的末尾,会在字符串后面添加字符 \13,而这是我不想要的。

zenity --question --no-wrap --title "pause" --text "L'habitude commence comme un fil de soie et devient vite un câble d'acier. - 西班牙谚语\13"

而 zenity 窗口会显示这个 \13 字符。

该如何解决呢?

谢谢

相关链接: 如何向字符串中添加双引号字符?

点赞
用户107090
用户107090

你的原始文本以 \13 结尾,表示回车符。使用以下方法移除它:

quote = quote:sub(quote,1,-2)

如果字符串可能没有以回车符结尾,则使用以下方法移除它(如果存在):

quote = quote:gsub("\13$","")
2021-04-16 09:51:46
用户2858170
用户2858170

你的引用包含一个回车符。回车符不是可打印字符。Lua 应该如何引用非可打印字符?

来自 Lua 5.4 参考手册:string.format

格式化符号 q 的作用是对布尔值、nil、数字和字符串进行格式化,使得结果是 Lua 源代码中的一个有效常量。布尔值和 nil 很容易被写入(true、false、nil)。浮点数被写成十六进制以保留完整的精度。字符串被写在双引号之间,如果必要的话会使用转义符号来确保它可以安全地被 Lua 解释器读回。例如,调用:

 string.format('%q', 'a string with "quotes" and \n new line')

可能会产生以下字符串:

 "a string with \"quotes\" and \
  new line"

如果你不想将其作为 \13 包含在字符串中,请将其删除。

您可以使用 string.sub 去除它。多个回车符最好使用 string.gsub 去除。

或者使用 string.format('"%s"', quote)string.format("\"%s\"", quote)。在字符串中编写双引号的方法甚至更多。

2021-04-16 09:52:39