web-dev-qa-db-fra.com

Forcer les chaînes en UTF-8 depuis n'importe quel encodage

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?

35
Hayk Saakian

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

56
kwarrick

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: ''})
28
John Pollard

Iconv

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)
4
Dipak Panchal