Ruby on rails 将文件写入S3时的字符编码问题
当我尝试在S3上创建一个包含特殊字符的文件时,如Ruby on rails 将文件写入S3时的字符编码问题,ruby-on-rails,ruby,amazon-web-services,amazon-s3,aws-sdk,Ruby On Rails,Ruby,Amazon Web Services,Amazon S3,Aws Sdk,当我尝试在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 => :publi
“”“--é
,文件中会写入不正确的数据,并且文件中会出现奇怪的字符。我使用的是亚马逊提供的官方软件。下面是示例代码:
@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™ -测试2-测试-test-测试-test-测试3-测试
我已经试用过aws sdk版本
1.11.1
和1.65.0
看起来您只需要指定文件的字符编码。您看到的字符串,test1™ 如果您将测试字符串视为Windows-1252编码的而不是UTF-8编码的,则测试字符串就是测试字符串的样子。如果在浏览器中查看(如果没有编码设置,通常默认为1252),请尝试将浏览器使用的编码更改为UTF-8(菜单类似于View)→ 编码
)
我对AWS api不太熟悉,但是查看一下,您可以使用:content\u 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。可能您的一个文件名是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
或其他
被盗自:有效!但是设置:content\u type为text/html
不起作用,设置:content\u encoding=>“utf-8”
参数也不起作用,但是按照您的建议将其与:content\u type
一起传递就可以了!AWS文档可能有缺陷,并且:内容编码不符合建议。@amit\u saxena内容编码
用于压缩(例如,您可能有一个标题内容编码:gzip
)。HTML的另一种替代方法是只将内容类型设置为文本/HTML
(即no;charset=UTF-8
),并在HTML本身中使用
标记,但如果可以的话,通常您希望在标题中进行编码。我们讨论的是在此处将文件写入Amazon S3,而不是在本地存储中。嗯,@amit_saxena,我很高兴你不需要修复我遇到的问题,但我可以向你保证我的答案与aws s3 sync
命令有关。