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:
"Ê»"
Ignorez le contrôleur pendant une minute et affinez-le un peu. Quelle est la sortie dans la console? – Matchu
Je sélectionne seulement les caractères appropriés avec cette déclaration: Page.find (2) .raw_html [91..94] "Ê" " – thekevinscott