Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/ruby/24.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ruby on rails 将文件写入S3时的字符编码问题_Ruby On Rails_Ruby_Amazon Web Services_Amazon S3_Aws Sdk - Fatal编程技术网

Ruby on rails 将文件写入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

当我尝试在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™ -测试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
命令有关。