Проблема с кодировкой Python - PullRequest
1 голос
/ 05 января 2010

Я действительно потерялся во всех проблемах кодирования / декодирования с Python. Прочитав довольно много документов о том, как правильно обрабатывать входящие сообщения, у меня все еще есть проблемы с несколькими языками, такими как корейский. Во всяком случае, вот что я делаю.

korean_text = korean_text.encode('utf-8', 'ignore')
korean_text = unicode(korean_text, 'utf-8')

Я сохраняю вышеуказанные данные в базе данных, которая проходит нормально.

Позже, когда мне нужно отобразить данные, я выбираю содержимое из базы данных и делаю следующее:

korean_text = korean_text.encode( 'utf-8' )
print korean_text

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

Спасибо

Ответы [ 3 ]

10 голосов
/ 05 января 2010

Даже прочитав несколько документов, вы, похоже, не понимаете, как работает юникод.

  • Юникод не является кодировкой. Юникод - это отсутствие кодировок.
  • utf-8 не является Unicode. utf-8 - это кодировка.
  • Вы декодируете utf-8 байтов, чтобы получить Unicode. Вы кодируете юникод, используя кодировку, скажем, utf-8, чтобы получить закодированную строку теста.
  • Только байтовые строки могут быть сохранены на диск, в базу данных или отправлены по сети, либо распечатаны на принтере или на экране. Юникод существует только внутри вашего кода.

Хорошей практикой является декодирование всего, что вы получаете, как можно раньше, работа с ним, декодированным как unicode, во всем вашем коде, а затем кодирование его как можно позже, когда текст готов покинуть вашу программу, чтобы экран, база данных или сеть.


Теперь к вашей проблеме:

Если у вас есть текст, полученный из браузера, скажем, из формы, то он закодирован. Это строка байтов. Это не Unicode.

Затем вы должны расшифровать его, чтобы получить Unicode. Расшифруйте его, используя кодировку браузера, используемого для кодирования. Правильная кодировка исходит из самого браузера в правильном заголовке HTTP REQUEST.

Не используйте 'ignore' при декодировании. Поскольку браузер сказал, какую кодировку он использует, вы не должны получать никаких ошибок. Использование 'ignore' означает, что вы будете скрывать ошибку, если она есть.

Возможно, ваш веб-фреймворк уже делает это. Я знаю, что django, пилоны, werkzeug, cherrypy все это делают. В этом случае вы уже получите Unicode.

Теперь, когда у вас есть декодированная строка Unicode, вы можете кодировать ее, используя любую кодировку, которую вы хотите сохранить в базе данных. utf-8 - хороший выбор, поскольку он может кодировать все кодовые точки Юникода.

Когда вы извлекаете данные из базы данных, декодируйте их, используя ту же кодировку, что и для их хранения. А затем закодируйте его, используя кодировку, которую вы хотите использовать на странице - ту, которая объявлена ​​в мета-заголовке html <meta http-equiv="Content-Type" content="text/html; charset=utf-8"/>. Если кодирование такое же, как и на предыдущем шаге, вы можете пропустить декодирование / перекодирование, поскольку оно уже закодировано в utf-8.

Если вы видите ???, то данные будут потеряны на любом шаге выше. Чтобы точно знать, нужна дополнительная информация.

0 голосов
/ 05 января 2010

Скорее всего, проблема (особенно если другие символы, не входящие в ASCII, работают нормально) заключается в том, что ваш браузер или операционная система не имеют правильных шрифтов для отображения корейского текста или что используемый по умолчанию браузер не использует шрифтподдерживать корейский.Попробуйте выбрать другой шрифт, пока он не заработает.

0 голосов
/ 05 января 2010

Прочитайте этот пост об обработке Unicode в Python.

Вы в основном хотите делать следующие вещи:

.encode() text to a particular encoding (such as utf-8) before sending it to the database.
.decode() text back to unicode (from your encoding) when reading it from the database
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...