Даже прочитав несколько документов, вы, похоже, не понимаете, как работает юникод.
- Юникод не является кодировкой. Юникод - это отсутствие кодировок.
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.
Если вы видите ???
, то данные будут потеряны на любом шаге выше. Чтобы точно знать, нужна дополнительная информация.