2011-07-22 3 views
1

Dans ma page ERB, je veux afficher l'un des noms de pays configurés dans ce fichier CSV:Affichage UTF-8 dans ERB dit « codages de caractères incompatibles » (pas de base de données impliqués)

Suisse 
Deutschland 
日本 

Voici la code qui charge le CSV dans config/initializers:

require 'csv' 
COUNTRIES = CSV.read("#{RAILS_ROOT}/config/countries.csv").flatten 

Voici le code dans le ERB:

<%= "Country:" + COUNTRIES[id].to_s %> 

I affiche bien quand id = 0 ou id = 1, mais quand id = 2 une erreur apparaît:

incompatible character encodings: ASCII-8BIT and UTF-8 

... avec l'erreur de pointage à la ligne ERB ci-dessus.
Comment le réparer?

Aucune base de données impliquée, Ruby 1.9.2-p180. UTF-8 à partir des fichiers de localisation est affiché correctement.

Répondre

4

De CSV#read docs:

Cette méthode comprend également un montant supplémentaire: paramètre de codage que vous pouvez utiliser pour spécifier l'encodage des données dans le fichier à lire. Vous devez fournir ceci à moins que vos données soient dans Encoding :: default_external(). CSV utilisera ceci pour déterminer comment analyser les données.

Donc juste pour être sûr, je voudrais tout d'abord utiliser

COUNTRIES = CSV.read("/Users/dumitru/test.csv", { encoding: "UTF-8" }).flatten 

et vérifier ce que

COUNTRIES[2].encoding.name 

dit a) directement après CSV#read et b) lorsqu'il est exécuté dans votre modèle de ERB. S'il est écrit "US-ASCII", alors vous devriez vérifier si quelque chose change accidentellement vos PAYS après les avoir analysés. Au moins, vous pouvez alors être sûr que quelque chose est impair entre les deux.

Je préfère aussi

<%= "Country:" + COUNTRIES[id] %> 

puisque vous avez déjà des chaînes là. Mais je ne pense pas que cela va guérir le problème, cependant.

Je ne pouvais pas imaginer que quelque chose change réellement le contenu de la chaîne mais peut-être que le codage a été réassocié en US-ASCII. Donc, vous pourriez avoir une bonne chance d'utiliser

COUNTRIES[2].force_encoding("UTF-8") 

avec votre chaîne afin de faire respecter l'association de retour en UTF-8.Si cela ne vous aide pas, je vais essayer

COUNTRIES[2].encode("UTF-8") 

Si toutes ces méthodes échouent, je besoin de connaître l'encodage au moment où vous essayez de rendre la chaîne dans votre modèle de ERB pour vous aider.

+0

Merci J'ai ajouté ', {encoding:" UTF-8 "}' comme vous l'avez suggéré et cela fonctionne! Etrangement, mon Encoding :: default_external() est #

+0

C'est étrange en effet, selon les docs cela devrait fonctionner automatiquement alors ... Si je l'essaye sur ma machine il se comporte correctement et l'analyse comme Chaînes UTF-8. Mais au moins, vous avez une solution qui fonctionne pour le moment :) – emboss

0

semble que votre fichier csv est pas enregistré en UTF-8, essayez de le convertir en utf-8

modifier: Je l'ai testé l'exemple ci-dessus sur mon mac local, en utilisant le même rubis version et cela fonctionne sans problèmes. J'ai créé un csv à partir de zéro et testé sur IRB.

ruby-1.9.2-p180 :004 > require 'csv' 
=> true 
ruby-1.9.2-p180 :006 > COUNTRIES = CSV.read("/Users/dumitru/test.csv").flatten 
=> ["Suisse", "Deutschland", "\xE6\x97\xA5\xE6\x9C\xAC"] 
ruby-1.9.2-p180 :007 > "Country:" + COUNTRIES[0].to_s 
=> "Country:Suisse" 
ruby-1.9.2-p180 :009 > "Country:" + COUNTRIES[2].to_s 
=> "Country:\xE6\x97\xA5\xE6\x9C\xAC" 
+0

Confirmé avec l'outil Linux 'isutf8': mon fichier est déjà UTF-8 –

+0

A propos de votre édition: Merci! J'ai essayé les mêmes commandes sur mon Ubuntu 2011.04 et j'ai exactement la même sortie. Mais encore, le modèle ERB échoue sur le japonais. –

Questions connexes