Ruby:有没有办法在File.write中指定编码



TL;DR

我该如何指定File.write上的编码模式,或者如何以类似的方式将图像二进制文件保存到文件中?

更多详细信息

我正在尝试从Trello卡下载一个图像,然后将该图像上传到S3,这样它就有了一个可访问的URL。我已经能够从Trello下载二进制图像(我相信这是某种形式的二进制图像),但我在使用File.write将其保存为.jpeg时遇到了问题。每次我尝试这样做时,它都会在我的Rails控制台中给我这个错误:

Encoding::UndefinedConversionError: "xFF" from ASCII-8BIT to UTF-8
from /app/app/services/customer_order_status_notifier/card.rb:181:in `write'

这是触发的代码

def trello_pics
@trello_pics ||=
card.attachments.last(config_pics_number)&.map(&:url).map do |url|
binary = Faraday.get(url, nil, {'Authorization' => "OAuth oauth_consumer_key="#{ENV['TRELLO_PUBLIC_KEY']}", oauth_token="#{ENV['TRELLO_TOKEN']}""}).body
File.write(FILE_LOCATION, binary) # doesn't work
run_me
end
end

所以我认为这一定是File.write将输入转换为文件的方式的问题。是否有指定编码的方法?

AFIK不能在执行write时执行,但可以在创建File对象时执行;这里有一个UTF8编码的例子:

File.open(FILE_LOCATION, "w:UTF-8") do 
|f|
f.write(....)
end

另一种可能性是使用external_encoding选项:

File.open(FILE_LOCATION, "w", external_encoding: Encoding::UTF_8)

当然,这假设所写入的数据是String。如果您有(打包的)二进制数据,您将使用"wb"打开文件,并使用syswrite而不是write将数据写入文件。

UPDATE正如enginesmnky在评论中指出的,编码的参数也可以作为参数传递给write方法本身,例如

IO::write(FILE_LOCATION, data_to_write, external_encoding: Encoding::UTF_8)

相关内容

  • 没有找到相关文章

最新更新