【问题标题】:Weird Characters encoding奇怪的字符编码
【发布时间】:2013-08-06 09:58:37
【问题描述】:

我的参数中有一个奇怪的行为,它作为 utf-8 传递,但特殊字符没有得到很好的管理。 我有 2 个字符,而不是 1 个特殊字符:普通字母 + 重音。

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,但不确定是载波问题还是我遗漏了什么......

【问题讨论】:

标签: ruby-on-rails ruby encoding special-characters carrierwave


【解决方案1】:

似乎与 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)

【讨论】:

    【解决方案2】:

    也许你有一个Combining character和一个Unicode equivalence的问题

    当我检查代码点时:

    #encoding: utf-8
    Parameters =  {"name"=>"Mylène.png",}
    
    p Parameters['name'].codepoints.to_a
    

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

    我希望你有一个combining grave accent 和一个e

    解决方案是 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"
    

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

    【讨论】:

    • 感谢提供线索! :) 发现是 MACOSX 故障,使用 utf-8-mac 编码进行文件系统命名...
    猜你喜欢
    • 2016-12-01
    • 1970-01-01
    • 2015-04-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多