2013-08-06 187 views
0

我有一個奇怪的行爲,在我的參數whichare utf-8傳遞,但特殊字符管理不善。 而不是1個特殊字符,我有2個字符:普通字母+重音。奇怪的字符編碼

Parameters: {"name"=>"Mylène.png", "_cardbiz_session"=>"be1d5b7a2f27c7c4979ac4c16fe8fc82", "authenticity_token"=>"9vmJ02DjgKYCpoBNUcWwUlpxDXA8ddcoALHXyT6wrnM=", "asset"=>{"file"=># < ActionDispatch::Http::UploadedFile:0x007f94d38d37d0 @original_filename="Mylène.png", @content_type="image/png", @headers="Content-Disposition: form-data; name=\"asset[file]\"; filename=\"Myle\xCC\x80ne.png\"\r\nContent-Type: image/png\r\n", @tempfile=# < File:/var/folders/q5/yvy_v9bn5wl_s5ccy_35qsmw0000gn/T/RackMultipart20130805-51100-1eh07dp > >}, "id"=>"copie-de-sm"} 

我記錄此:

  • logger.debug FILE_NAME
  • logger.debug file_name.chars.map(&:to_s).inspect

每一次,同樣的結果:

  • Mylène
  • [ 「M」, 「Y」, 「升」, 「E」, 「」, 「N」, 「E」]

正如我嘗試使用文件名作爲與已經匹配器現有名稱正確編碼UTF-8,你看我的問題;)

  • 編碼是UTF-8無處不在。
  • 在ruby 1.9.3和rails 3.2.14下工作。
  • 在涉及的任何文件的頂部添加#encoding:utf-8。

我任何人作爲一個想法,把它!

這裏我也發表了問題:https://github.com/carrierwaveuploader/carrierwave/issues/1185但不知道如果其carrierwave問題,或者我失去了一些東西......

+0

聽起來像[Unicode等值](http://en.wikipedia.org/wiki/Unicode_equivalence)的問題您是否嘗試過Unicode規範化? – knut

回答

1

也許你有一個Combining characterUnicode equivalence

當我檢查有問題與碼點:

#encoding: utf-8 
Parameters = {"name"=>"Mylène.png",} 

p Parameters['name'].codepoints.to_a 

我得到Myl\u00E8ne.png,但我認爲這是一個轉換的問題,當我複製的文本。如果你能提供一個帶有原始數據的文件,這將是有益的。

我希望你有一個combining grave accente

的解決方案將是一個Unicode正常化。 (對不起,我不知道怎麼用ruby做,也許別人有答案)。


你發現你的問題,所以這不再需要你。

但與此同時,我發現了一個機制來規範Unicode字符串:

#encoding: utf-8 
text = "Myl\u00E8ne.png" #"Mylène.png" 
text2 = "Myle\u0300ne.png" #"Mylène.png" 

puts text #Mylène.png 
puts text2 #Mylène.png 

p text == text2 #false 

#http://apidock.com/rails/ActiveSupport/Multibyte/Unicode/normalize 
require 'active_support' 
p text                 #"Myl\u00E8ne.png" 
p ActiveSupport::Multibyte::Unicode.normalize(text, :d) #"Myle\u0300ne.png" 

p text2                 #"Myle\u0300ne.png" 
p ActiveSupport::Multibyte::Unicode.normalize(text2, :c)#"Myl\u00E8ne.png" 

也許還有一個更簡單的方法,但到現在爲止我沒有發現。

+0

感謝您領先的線索! :)發現它是使用utf-8-mac編碼進行文件系統命名的MACOSX故障... – gdurelle