当我尝试在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.1
和1.65.0
。
答案 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-8
或setenv LC_ALL en_US.UTF-8
或其他。
被盗:http://randysofia.com/2014/06/06/aws-cli-and-your-locale/