将文件写入S3时的字符编码问题

时间:2016-01-22 11:30:38

标签: ruby-on-rails ruby amazon-web-services amazon-s3 aws-sdk

当我尝试在S3上创建一个包含‘’ “” – — é等特殊字符的文件时,会在文件上写入不正确的数据,并在文件中显示奇怪的字符。我使用亚马逊提供的官方aws-sdk ruby gem 。以下是示例代码:

@bucket = AppConfig.s3_bucket
@s3 = AWS::S3.new
file = @s3.buckets[@bucket].objects['amit/test']
file.write("‘test1’ “test2” test–test—test3 é-test", :acl => :public_read)

我也尝试过:

file.write("‘test1’ “test2” test–test—test3 é-test", :acl => :public_read, :content_type => 'text/html')
file.write("‘test1’ “test2” test–test—test3 é-test", :acl => :public_read, :content_type => 'text/plain')
file.write("‘test1’ “test2” test–test—test3 é-test", :acl => :public_read, :content_type => 'text/plain', :content_encoding => 'utf-8')

输出文件如下所示: ‘test1’ “test2†test–test—test3 é-test

我尝试过使用aws-sdk版本1.11.11.65.0

2 个答案:

答案 0 :(得分:4)

这看起来只需要指定文件的字符编码。您看到的字符串‘test1’ “test2†test–test—test3 é-test是您的测试字符串,如果您将其视为Windows-1252编码而不是UTF-8。如果您在浏览器中查看(如果没有编码设置,通常默认为1252),请尝试将浏览器使用的编码更改为UTF-8(菜单类似于View → Encoding)。< / p>

我不熟悉AWS api,但查看the docs建议您可以使用:content_type调用write选项指定内容类型。尝试:

file.write("‘test1’ “test2” test–test—test3 é-test", :acl => :public_read, :content_type => "text/plain; charset=utf-8")

(或者您可能需要text/html而不是text/plain。)

如果我理解了文档,这应该会导致AWS在检索对象时设置内容类型标题。

这一切都取决于你用来获取读取标题的对象。如果不是,您可能必须配置您的客户端告诉它数据是UTF-8。

答案 1 :(得分:0)

您的某个文件名可能是unicode,并且您没有设置适当的区域设置来处理它。

检查:

$ locale

LANG=
LC_CTYPE="C"
LC_COLLATE="C"
LC_TIME="C"
LC_NUMERIC="C"
LC_MONETARY="C"
LC_MESSAGES="C"
LC_ALL=

修复:

$ locale -a |grep en_US
en_US.ISO8859-1
en_US.ISO8859-15
en_US.US-ASCII
en_US.UTF-8

$ export LC_ALL=en_US.UTF-8

注意:根据您的shell,您需要使用适当的方法来设置环境变量export LC_ALL=en_US.UTF-8setenv LC_ALL en_US.UTF-8或其他。

被盗:http://randysofia.com/2014/06/06/aws-cli-and-your-locale/