Lua で Web から画像をスクレイピングするプログラムを作成しようとしています。軽微な問題として、画像に拡張子がない、または拡張子が正しくない場合があります。たとえば、このアニメーション化された「jpeg」を参照してください: http://i.imgur.com/Imvmy6C.jpg
そこで、画像のファイルタイプを検出する関数を作成しました。返された画像の最初の数文字を比較するだけです。PNG ファイルは PNG で始まり、GIF は GIF で始まり、JPG は奇妙な記号 "╪" で始まります。
画像は文字列として表現されるべきではないため、少しハックですが、うまくいきました。実際にコードを実行したときを除いて。
コマンドラインにコードを入力すると、正常に動作します。しかし、コードを含むファイルを実行すると、機能しません。奇妙なことに、それはjpegsでのみ失敗します。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