Как конвертировать текст в Unicode в Rails? - PullRequest
3 голосов
/ 31 мая 2011

В моей базе данных есть следующая запись

id     |      name      |      info
1          John Smith         Çö ¿¬¼

Как вы можете сказать, информационный столбец отображается неправильно - хотя на самом деле это корейский язык.В Chrome, когда я переключаю кодировку браузера с UTF-8 на корейский (мне кажется, 'euc-kr'), мне действительно удается просмотреть текст следующим образом:

id     |      name      |      info
1          John Smith        횉철 쩔짭쩌

Затем я вручную копируютекст в информацию в базе данных и сохранить, и теперь я могу просматривать его в UTF-8, не переключая кодировку моего браузера.

Удивительно.Теперь я хотел бы сделать то же самое в Rails, а не вручную.Итак, начиная с исходной записи снова, я иду к консоли и набираю:

require 'iconv'
u = User.find(1)
info = u.info
new_info = Iconv.iconv('euc-kr','UTF-8', info)
u.update_attribute('info', new_info)

Однако в итоге я получаю нечто похожее на \x{A2AF}\x{A8FA}\x{A1C6} \x{A2A5}\x{A8A2} в базе данных, а не 횉철 쩔짭쩌.

У меня есть базовое понимание юникода и кодировки.

Может кто-нибудь объяснить, что здесь происходит и как обойти это?Желаемый результат - это то, чего я достиг вручную.

Спасибо!

Ответы [ 2 ]

4 голосов
/ 31 мая 2011

Ничего себе.Я бью себя по голове сейчас.После нескольких часов попыток решить эту проблему, я, наконец, сам понял это через несколько минут после того, как разместил здесь вопрос.

Решение состоит из трех простых шагов:

ШАГ 1:

Я почти понял это правильно.Я не должен был конвертировать euc-kr в utf-8, а наоборот:

Iconv.iconv('UTF-8', 'euc-kr', info)

ШАГ 2:

Я мог быЯ все еще сталкиваюсь с некоторыми ошибками в тексте, поэтому, чтобы быть в безопасности, я говорю Iconv игнорировать любые ошибки:

Iconv.iconv('UTF-8//IGNORE', 'euc-kr', info)

Наконец, я действительно получаю РЕАЛЬНЫЙ КОРЕЙСКИЙ ТЕКСТ, ура!Проблема в том, что, когда я пытаюсь вставить его в базу данных, он все равно вставляет что-то вроде:

UPDATE `users` SET `info` = '--- \n- \"\\xEC\\xB2\\xA0\\xEC\\xB1\\x8C...' etc...

Даже если оказывается, что у меня правильный текст.Так почему это так?На последнем шаге.

ШАГ 3:

Оказывается, выход Iconv является массивом.Итак, мы объединяем его с join:

Iconv.iconv('UTF-8//IGNORE', 'euc-kr', info).join

И это на самом деле работает!

Окончательный код:

require 'iconv'
u = User.find(1)
info = u.info
new_info = Iconv.iconv('UTF-8//IGNORE','euc-kr', info).join
u.update_attribute('info', new_info)

Надеюсь, это поможет всем, кто это увидит(и зная себя, вероятно, будущие меня).

0 голосов
/ 31 мая 2011

почему вы используете Iconv для его конвертации?во-первых, если вы видите правильный стиль в базе данных, вы должны убедиться, что кодировка базы данных имеет значение utf8 на стороне сценария, вы просто сохраняете корейское значение, а не используете Iconv

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