2010-12-15 61 views
2

J'ai une base de données MySQL, configurée pour utiliser UTF-8.Codage UTF-8 dans un modèle de rails

Dans ma base de données.yml, la base de données est définie sur utf8. Je fais du grattage HTML et je l'insère dans la base de données MySQL.

Si je récupère le code HTML à partir de la base de données en PHP, il encode correctement tous les caractères et produit d'entrée bien:

// code 
$result = mysql_query("SELECT raw_html FROM pages WHERE id = 1"); 
echo mysql_result($result,0); 

// output 
Hawaiʻi. 

Et la sortie ressemble beaucoup. Cependant, dans des rails, je reçois des personnages étranges:

// code in the controller 
@page = Page.find(params[:id]) 

// code in the view 
<%= @page.raw_html %> 

// output 
Hawaiʻi 

Y at-il un autre endroit que je dois forcer UTF-8? J'ai essayé d'utiliser la bibliothèque iconv en vain (sauf si je l'utilise mal).

MISE À JOUR: J'ai reproduit le même problème lors de l'utilisation de la console. Alors:

Page.find(2).raw_html[91..94] 

"Ê»" 

Le problème se produit également sous la console (script/console) si cela jette plus de lumière sur la question.

MISE À JOUR 2: Bon, après une enquête plus poussée, j'ai réalisé que je faisais quelque chose de stupide. Mais ça ne l'a pas réparé.

Alors que la table était définie sur UTF8, la colonne ne l'était pas. J'ai changé la colonne pour être 'utf8_general_ci'. Cependant (et cela me fait penser que je suis vissant quelque chose de base vers le haut), ce produit en fait le résultat correct:

@raw_html = Iconv.conv('LATIN1','UTF-8',@page.raw_html[0..10000]) 

qui sort belle. Malheureusement, si je lance la page entière à travers, je reçois:

Iconv::IllegalSequence in PagesController#show 
"€²18″N<"... 

Donc, il y a d'autres choses froussard se passe là-dedans. Se pourrait-il que je l'ai encore encodé en 'latin', même si j'ai explicitement mis à la fois la table et la colonne en UTF-8 (et repopulé le HTML)? J'utilise actuellement la gemme mysql2, selon la suggestion de Jeffrey. MISE À JOUR 3: Pour clarifier, je reçois également des erreurs de console.Voici la commande:

Page.find(2).raw_html[91..94] 

Et voici la réponse:

"Ê»" 
+0

Ignorez le contrôleur pendant une minute et affinez-le un peu. Quelle est la sortie dans la console? – Matchu

+0

Je sélectionne seulement les caractères appropriés avec cette déclaration: Page.find (2) .raw_html [91..94] "Ê" " – thekevinscott

Répondre

5

Dans votre base de données. yml ajouter encoding: utf8 à chacune de vos configurations d'environnement.

+0

Déjà compris, merci! – thekevinscott

+0

Dans ce cas, le problème peut-être que vous n'avez pas besoin, vous devez ajouter cela lorsque le classement de votre base de données est mis à utf8 mais si le vôtre est en latin ou similaire, vous n'aurez pas besoin de cela. Retrait peut très bien résoudre votre problème. – Richard

+1

WOW Merci cela a fonctionné! J'ai supprimé le classement et maintenant le texte sort correctement. Pourquoi, cependant? Je ne comprends pas; Si la base de données est UTF-8 (et à ce stade, j'ai vérifié à plusieurs reprises), pourquoi supprimer cela comme par magie le faire fonctionner? – thekevinscott

0

Vérifiez que vous avez défini le codage de caractères pour la page html dans votre mise en page

Si vous utilisez HTML5, essayez d'ajouter ceci comme la première ligne de votre page

<meta charset="UTF-8"> 

Pour HTML 4, essayez d'ajouter ceci à la section de tête ion de la page

<meta http-equiv="Content-type" content="text/html;charset=UTF-8"> 

Pour les pages XHTML, essayez

<meta http-equiv="Content-type" content="text/html;charset=UTF-8" /> 

si vous servez avec le texte/html type MIME, et ce

<?xml version="1.0" encoding="UTF-8"?> 

comme la toute première ligne de le fichier servi si son XHTML a servi de XML

+0

C'est XHTML, et il est défini sur mais pas de dés – thekevinscott

2

Vous pourriez passer à mysql2 :)

Set à la fois votre fichier de pierres précieuses et database.yml

Adaptateur: mysql2

bijou "mysql2"

Cela devrait vous faire économiser beaucoup d'ennuis :)

+0

Essayé, ceci, mais il n'a pas fait le travail. – thekevinscott