Je savais que la gestion de l'utf en ruby (1.8) était un gros problème auquel je n'avais pas encore été confronté. Mais dans mon cas le plus gros problème a été de trouver une page web qui m'explique comment faire au lieu de se plaindre :(
Il y a tellement de pages sur des forums etc... qui expliquent qu'il y a un problème sans fournir de solution claire!
Malheureusement dans son exemple je perdais les accents (c'est embêtant :( )
Voilà l'exemple corrigé pour transfromer de l'UTF-16 vers de l'ISO-8859-1. Pour UTF-8 il suffit de remplacer 16 par 8 étonnant non ? ;)
require 'iconv'
class String
def utf16_to_iso
converter = Iconv.new('ISO-8859-1//IGNORE//TRANSLIT', 'UTF-16')
converter.iconv(self)
end
end
content = IO.read("utf16.txt").utf16_to_iso
content.split("\n").each do |line|
do_something(line)
end
IGNORE veut dire que Iconv va ignorer les erreurs de conversion. Si vous voulez être prévenu quand vous avez un caractère exotique, enlevez cette option.
TRANSLIT essaye de trouver le caractère le plus proche de celui de utf dans iso.
Petite astuce UTF-16, je n'ai pas pu utiliser la méthode:
IO.foreach que j'aime beaucoup en temps normal parce que cette méthode split sur le caractère "\n" or en UTF-16 comme c'est stocké sur deux octets le retour à la ligne est "\n\000". J'ai donc converti la chaine avant de faire le split.