Dans mon application Rails, je travaille avec des flux RSS du monde entier, et certains flux ont des liens qui ne sont pas en UTF-8. Les liens de flux d'origine sont hors de mon contrôle, et afin de les utiliser dans d'autres parties de l'application, ils doivent être en UTF-8.
Comment détecter l'encodage et convertir en UTF-8?
Ruby 1.9
"Forcer" un encodage est facile, mais il ne convertira pas les caractères, il suffit de changer l'encodage:
str = str.force_encoding("UTF-8")
str.encoding.name # => 'UTF-8'
Si vous souhaitez effectuer une conversion, utilisez encode
:
begin
str.encode("UTF-8")
rescue Encoding::UndefinedConversionError
# ...
end
Je voudrais certainement lire le post suivant pour plus d'informations:
http://graysoftinc.com/character-encodings/Ruby-19s-string
Cela garantira que vous avez le codage correct et ne générera pas d'erreur car il remplace tout caractère non valide ou non défini par une chaîne vide.
Cela garantira, peu importe quoi, que vous avez une chaîne UTF-8 valide
str.encode(Encoding.find('UTF-8'), {invalid: :replace, undef: :replace, replace: ''})
require 'iconv'
i = Iconv.new('UTF-8','LATIN1')
a_with_hat = i.iconv("\xc2")
Résumé: la gemme iconv fait tout le travail de conversion des encodages. Assurez-vous qu'il est installé avec:
gem install iconv
Maintenant, vous devez savoir dans quel codage votre chaîne se trouve actuellement en tant que Ruby 1,8 traite les chaînes comme un tableau d'octets (sans codage intrinsèque). Par exemple, disons que votre chaîne était en latin1 et vous voulait le convertir en utf-8
require 'iconv'
string_in_utf8_encoding = Iconv.conv("UTF8", "LATIN1", string_in_latin1_encoding)