0

我的参数中有一个奇怪的行为,它作为 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 文件名
  • logger.debug file_name.chars.map(&:to_s).inspect

每次,相同的结果:

  • 米莱娜
  • [“M”、“y”、“l”、“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 但不确定它是载波问题还是我遗漏了什么......

4

2 回答 2

3

似乎与 MACOSX 相关联。

https://www.ruby-forum.com/topic/4407424对其进行了解释,并参考https://bugs.ruby-lang.org/issues/7267了解更多详细信息和讨论。

MACOSX 将特殊字符分解为utf8-mac而不是utf-8 ...

虽然您不知道文件名的编码,但只是假设它。

感谢我们的 Linux 人员,它可以正常工作。;)

file_name.encode!('utf-8', 'utf-8-mac').chars.map(&:to_s)
于 2013-08-06T13:11:31.573 回答
1

也许你有一个组合字符和一个Unicode 等价问题

当我检查代码点时:

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

p Parameters['name'].codepoints.to_a

我明白Myl\u00E8ne.png了,但我认为这是复制文本时的转换问题。如果您可以提供包含原始数据的文件,那将很有帮助。

我希望你的口音和重音相结合e

解决方案是 Unicode 规范化。(对不起,我不知道如何用红宝石来做。也许其他人有答案)。


你发现了你的问题,所以你不再需要这个了。

但与此同时,我发现了一种规范化 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"

也许有更简单的方法,但到目前为止我还没有找到。

于 2013-08-06T10:29:23.950 回答