【问题标题】:Strange bug involving string comparison in LuaLua中涉及字符串比较的奇怪错误
【发布时间】:2014-09-25 19:11:16
【问题描述】:

我正在尝试创建一个在 Lua 中从网络上抓取图像的程序。一个小问题是图像有时没有扩展名或扩展名不正确。请参阅此动画“jpeg”,例如:http://i.imgur.com/Imvmy6C.jpg

所以我创建了一个函数来检测图像的文件类型。这很简单,只需比较返回图像的前几个字符即可。 Png 文件以 PNG 开头,GIF 以 GIF 开头,JPG 以奇怪的符号“╪”开头。

这有点笨拙,因为图像不应该被表示为字符串,但它工作得很好。除非我实际运行代码。

当我在命令行中输入代码时,它工作正常。但是当我运行一个包含代码的文件时,它不起作用。更奇怪的是,它只在 jpeg 上失败。它仍然可以正确识别 PNG 和 GIF。

这是重现该错误所需的最少代码:

http = require "socket.http"
function detectImageType(image)
    local imageType = "unknown"
    if string.sub(image, 2, 2) == "╪" then imageType = "jpg" end
    return imageType
end
image = http.request("http://i.imgur.com/T4xRtBh.jpg")
print(detectImageType(image))

将其复制并粘贴到命令行中会正确返回“jpg”。将此作为文件运行会返回“未知”。

我在 Windows 8.1 上通过 powershell 使用 Lua for Windows 包中的 Lua 5.1.4。

编辑:

发现问题 string.byte("╪") 在命令行返回 216,作为文件运行时返回 226。我不知道为什么,也许 lua 和 powershell 的编码不同?

这一行解决了问题:

if string.byte(string.sub(image, 2, 2)) == 216 then imageType = "jpg" end

【问题讨论】:

  • 您的示例图像是动画 GIF,而不是 JPEG。至少 IE 是这么说的。代码本身中的那个是 JPG 好吧...
  • 这是一个扩展名错误的文件示例。有人对其进行了编辑,但最初它是指向 .jpg 的链接,实际上是 .gif。

标签: lua jpeg luasocket


【解决方案1】:

我认为这是因为当您保存文件时,您将其保存为不同的编码,因此 ╪ 字符可能会转换为另一个字符。转成字节码更健壮:

http = require "socket.http"
function detectImageType(image)
    local imageType = "unknown"
    if string.byte(image, 2) == 216 then imageType = "jpg" end
    return imageType
end
image = http.request("http://i.imgur.com/T4xRtBh.jpg")
print(detectImageType(image))

【讨论】:

    猜你喜欢
    • 2011-09-18
    • 2011-04-07
    • 2011-05-06
    • 1970-01-01
    • 2015-08-29
    • 1970-01-01
    • 1970-01-01
    • 2019-10-26
    • 1970-01-01
    相关资源
    最近更新 更多