3 votes

Comment convertir un texte en unicode dans Rails ?

Dans ma base de données, j'ai l'entrée suivante

id     |      name      |      info
1          John Smith         Çö ¿¬¼

Comme vous pouvez le constater, la colonne d'information s'affiche de manière erronée - c'est en fait du coréen. Dans Chrome, lorsque je passe l'encodage du navigateur de UTF-8 à coréen ('euc-kr', je crois), je parviens à afficher le texte comme tel :

id     |      name      |      info
1          John Smith         

Je copie ensuite manuellement le texte dans les informations de la base de données et je l'enregistre, et je peux maintenant l'afficher en UTF-8, sans changer l'encodage de mon navigateur.

Génial. Maintenant, j'aimerais faire la même chose avec Rails, et non pas manuellement. Donc, en commençant par l'entrée originale, je vais dans la console et je tape :

require 'iconv'
u = User.find(1)
info = u.info
new_info = Iconv.iconv('euc-kr','UTF-8', info)
u.update_attribute('info', new_info)

Cependant, je me retrouve avec quelque chose qui ressemble à ce qui suit \x{A2AF}\x{A8FA}\x{A1C6} \x{A2A5}\x{A8A2} dans la base de données, et non .

J'ai une compréhension très basique de l'unicode et de l'encodage.

Quelqu'un peut-il expliquer ce qui se passe ici et comment contourner ce problème ? Le résultat souhaité est celui que j'ai obtenu manuellement.

Merci de votre attention !

4voto

yuval Points 6237

Wow. Je suis en train de me prendre la tête. Après avoir passé des heures à essayer de résoudre ce problème, j'ai finalement trouvé la solution moi-même quelques minutes après avoir posé une question ici.

La solution consiste en trois étapes simples :

ÉTAPE 1 :

J'avais presque raison. Je ne devrais pas convertir de euc-kr à utf-8, mais l'inverse, en tant que tel :

Iconv.iconv('UTF-8', 'euc-kr', info)

ÉTAPE 2 :

Il se peut que je rencontre encore des erreurs dans le texte, alors pour être sûr, je dis à Iconv d'ignorer toutes les erreurs :

Iconv.iconv('UTF-8//IGNORE', 'euc-kr', info)

Enfin, j'obtiens un VRAI TEXTE CORÉEN, yay ! Le problème, c'est que lorsque j'essaie de l'insérer dans la base de données, il insère toujours quelque chose du genre :

UPDATE `users` SET `info` = '--- \n- \"\\xEC\\xB2\\xA0\\xEC\\xB1\\x8C...' etc...

Même s'il s'avère que j'ai le bon texte. Pourquoi cela ? Passons à la dernière étape.

ÉTAPE 3 :

Il s'avère que la sortie d'Iconv est un tableau. Nous le fusionnons donc avec join :

Iconv.iconv('UTF-8//IGNORE', 'euc-kr', info).join

Et ça marche !

Le code final :

require 'iconv'
u = User.find(1)
info = u.info
new_info = Iconv.iconv('UTF-8//IGNORE','euc-kr', info).join
u.update_attribute('info', new_info)

J'espère que cela aidera ceux qui verront ce document (et me connaissant, je pense que ce sera probablement le cas dans le futur).

0voto

inruby Points 121

Pourquoi utiliser Iconv pour le convertir ? tout d'abord, si vous voyez le bon style sur la base de données, vous devriez vous assurer que le charset de la base de données est utf8 du côté de script, il suffit de sauvegarder la valeur coréenne, sans utiliser Iconv.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X