2016-01-22 116 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