Codificación de caracteres extraños

Tengo un comportamiento extraño en mis parámetros que se pasan como utf-8 pero los caracteres especiales no están bien administrados. En lugar de 1 carácter especial, tengo 2 caracteres: la letra normal + el acento.

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=#  >}, "id"=>"copie-de-sm"} 

Me registro esto:

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

Cada vez, mismo resultado:

  • Mylène
  • [“M”, “y”, “l”, “e”, “̀”, “n”, “e”]

Cuando trato de usar el nombre de archivo como un comparador con nombres ya existentes codificados adecuadamente utf-8, ves mi problema;)

  • Las codificaciones son utf-8 en todas partes.
  • trabajando bajo Ruby 1.9.3 y Rails 3.2.14.
  • Se agregó #encoding: utf-8 en la parte superior de cualquier archivo involucrado.

Yo, cualquiera que sea una idea, tómala!

También publiqué un Issue aquí: https://github.com/carrierwaveuploader/carrierwave/issues/1185 pero no estoy seguro si es un problema de carrierwave o si me falta algo …

Parece estar vinculado a MACOSX.

https://www.ruby-forum.com/topic/4407424 lo explica y se refiere a https://bugs.ruby-lang.org/issues/7267 para más detalles y discute.

MACOSX descomponiendo caracteres especiales en utf8-mac en lugar de utf-8

Si bien no puede saber la encoding de un nombre de archivo, simplemente presupóngalo.

Gracias a nuestro chico de Linux donde funciona correctamente. 😉

 file_name.encode!('utf-8', 'utf-8-mac').chars.map(&:to_s) 

Quizás tenga un carácter de Combinación y un problema con la equivalencia de Unicode

Cuando reviso los puntos de código con:

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

Obtengo Myl\u00E8ne.png , pero creo que ese es un problema de conversión cuando copio el texto. Sería útil, si puede proporcionar un archivo con los datos en bruto.

Espero que tengas una combinación de acento grave y una e

La solución sería una normalización de Unicode. (Lo siento, no sé cómo hacerlo con ruby. Quizás alguien más tenga una respuesta para eso).


Encontraste tu problema, así que esto ya no es necesario para ti.

Pero mientras tanto, encontré un mecanismo para normalizar las cadenas de 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://sofes.miximages.com/ruby-on-rails/normalize require 'active_support' p text" 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" 

Tal vez haya una forma más fácil, pero hasta ahora no encontré ninguna.