У меня есть база данных MySQL, настроенная на использование UTF-8.
В моем файле database.yml для базы данных задано значение utf8.
Я делаю некоторые операции по очистке и вставке HTML в базу данных MySQL.
Если я получаю HTML из базы данных на PHP, он правильно кодирует все символы и производит точный ввод:
// code
$result = mysql_query("SELECT raw_html FROM pages WHERE id = 1");
echo mysql_result($result,0);
// output
Hawaiʻi.
И вывод выглядит великолепно. Однако в рельсах я получаю странные символы:
// code in the controller
@page = Page.find(params[:id])
// code in the view
<%= @page.raw_html %>
// output
Hawaiʻi
Где-то еще мне нужно форсировать UTF-8? Я пытался использовать библиотеку iconv безрезультатно (если я не использую ее неправильно).
UPDATE:
Я воспроизвел ту же проблему при использовании консоли. Итак:
Page.find(2).raw_html[91..94]
"Ê»"
Проблема также возникает под консолью (скрипт / консоль), если это проливает свет на проблему.
ОБНОВЛЕНИЕ 2:
Хорошо, при дальнейшем расследовании я понял, что делал что-то глупое. Но это не исправило это.
Хотя для таблицы было установлено UTF8, столбец не был. Я изменил столбец на utf8_general_ci. Однако (и это заставляет меня думать, что я испорчил что-то простое), это на самом деле дает правильный результат:
@raw_html = Iconv.conv('LATIN1','UTF-8',@page.raw_html[0..10000])
Прекрасно выходит. К сожалению, если я пропущу всю страницу, я получу:
Iconv::IllegalSequence in PagesController#show
"€²18″N<"...
Так что там есть еще кое-что интересное. Может ли быть так, что у меня до сих пор кодируется «латинский», хотя я явно установил для таблицы и столбца UTF-8 (и заново заполнил HTML)? В настоящее время я использую камень mysql2, согласно предложению Джеффри.
ОБНОВЛЕНИЕ 3: Чтобы уточнить, я также получаю ошибки консоли. Это команда:
Page.find(2).raw_html[91..94]
И это ответ:
"Ê»"