2016-01-22 117 views
1

当我尝试在S3上使用特殊字符(如‘’ “” – — é)在S3上创建文件时,会在文件上写入不正确的数据,并在文件中出现奇怪的字符。我正在使用亚马逊提供的官方aws-sdk ruby gem。下面是示例代码:将文件写入S3时的字符编码问题

@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尝试。

回答

3

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

我对AWS api并不熟悉,但看the docs建议您可以指定呼叫的:content_type选项的内容类型。尝试:

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

(或者您可能希望text/html而不是text/plain

这应该,如果我理解文档,导致AWS来检索对象时设置Content-Type头。

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

+0

作品!但是将content_type设置为'text/html'不起作用,并且也没有设置':content_encoding =>'utf-8''参数,但是将它与':content_type'一起传递,正如您所建议的那样工作正常!可能AWS文档有问题,':content_encoding'不能按照建议工作。 –

+2

@amit_saxena'content_encoding'用于压缩之类的东西(例如,你可能有一个头文件'Content-encoding:gzip')。 HTML的另一种替代方法是将content_type设置为text/html(即没有字符集= UTF-8),并在HTML本身中使用一个''标签,但通常你会想如果可以的话,在标题中有编码。 – matt

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/

+0

我们正在讨论将文件写入Amazon S3而不是本地存储。 –

+0

嗯,@ amit_saxena,我很高兴你不需要解决我遇到的问题,但我可以向你保证我的答案与'aws s3 sync'命令相关。 – Saran