Unicode символы из базы данных не распознаются - PullRequest
2 голосов
/ 06 сентября 2011

Это ставит меня в тупик. Я обновляю довольно большое приложение (для меня) с Rails 2.3 до Rails 3.0. Я также запускаю это приложение в Ruby 1.9.2 в отличие от 1.8.7 ранее. Кроме того, я также переключился на HTML5. Поэтому в игре много переменных.

На нескольких страницах текст, поступающий из базы данных MySQL, просто больше не отображается правильно. Это может быть как простой символ евро (€), так и эзотерический, как в некоторых санскритских текстах: सर्वम् मंगलम्

Хотя на старом сайте все выглядело отлично, теперь я получаю некоторые символы мусора, такие как ‚‚ вместо знака евро или следующие:

सर्वम् मंगलम्

... вместо санскритского текста.

Данные в базе данных не изменены. Насколько я знаю, все настроено для utf-8 везде.

Что дает?

Редактировать 1 после помощи Роланда:

Вот что я получаю в базах данных MySQL на сервере Ubuntu:

mysql> SHOW VARIABLES LIKE 'character_set%';
+--------------------------+----------------------------+
| Variable_name            | Value                      |
+--------------------------+----------------------------+
| character_set_client     | latin1                     |
| character_set_connection | latin1                     |
| character_set_database   | latin1                     |
| character_set_filesystem | binary                     |
| character_set_results    | latin1                     |
| character_set_server     | latin1                     |
| character_set_system     | utf8                       |
| character_sets_dir       | /usr/share/mysql/charsets/ |
+--------------------------+----------------------------+

но вот что я получаю от запуска команды на моем локальном mac:

mysql> SHOW VARIABLES LIKE 'character_set%';
+--------------------------+------------------------------------------------------+
| Variable_name            | Value                                                |
+--------------------------+------------------------------------------------------+
| character_set_client     | utf8                                                 |
| character_set_connection | utf8                                                 |
| character_set_database   | utf8                                                 |
| character_set_filesystem | binary                                               |
| character_set_results    | utf8                                                 |
| character_set_server     | utf8                                                 |
| character_set_system     | utf8                                                 |
| character_sets_dir       | /usr/local/Cellar/mysql/5.5.14/share/mysql/charsets/ |
+--------------------------+------------------------------------------------------+

Второй список выглядит лучше для меня (который не очень хорошо понимает кодировку).

Должен ли я изменить настройки баз данных моего сервера? Разве это не испортит их существующие данные? Если да, то как мне поменять чарса? установить переменные?

1 Ответ

5 голосов
/ 06 сентября 2011

Когда вы интерпретируете данную строку как Unicode, сохраните ее как UTF-8 в поток байтов и затем преобразуете поток байтов в MacRoman, вы получите правильные байты.Это строка в кодировке UTF-8.

Я сделал это (в терминале UTF-8):

$ echo 'सर्वम् मंगलम्' > in
$ iconv -f UTF-8 -t MacRoman < in
सर्वम् मंगलम्

Итак, где-то выполняется обратное преобразование данных.Поток байтов интерпретируется как MacRoman , а затем снова преобразуется в UTF-8.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...