2010-03-06 3 views
64

Я начал пытаться хранить строки в SQLite с помощью питона, и получил сообщение:SQLite, Python, Юникод и не-UTF данные

sqlite3.ProgrammingError: You must not use 8-bit bytestrings unless you use a text_factory that can interpret 8-bit bytestrings (like text_factory = str). It is highly recommended that you instead just switch your application to Unicode strings.

Хорошо, я переключился на строки Unicode. Затем я начал получать сообщение:

sqlite3.OperationalError: Could not decode to UTF-8 column 'tag_artist' with text 'Sigur Rós'

при попытке извлечь данные из базы данных. Необходимы дополнительные исследования, и я начал кодирования его в utf8, но начинается тогда «Sigur Ros» похожий «Sigur Rós»

примечание: Моя консоль была настроена на показ в «latin_1» как @John Мачин указал.

Что дает? После прочтения this, описывая точно такую ​​же ситуацию, в которой я оказался, кажется, что совет состоит в том, чтобы игнорировать другой совет и использовать 8-битные байты в конце концов.

Я не знал много о unicode и utf, прежде чем начал этот процесс. За последние пару часов я узнал немало, но я все еще не знаю, есть ли способ правильно преобразовать '-' из латинского-1 в utf-8 и не калечить его. Если этого не произойдет, почему SQLite настоятельно рекомендует переключить мое приложение на строки unicode?


Я буду обновлять этот вопрос с кратким и некоторые примеры кода из всего, что я узнал за последние 24 часов, так что кто-то в моей обуви может иметь легкий (ER) руководство. Если информация, которую я публикую, неверна или вводит в заблуждение, пожалуйста, скажите мне, и я обновлю, или один из вас, старшие ребята, может обновить.


Резюме ответов

Позвольте мне первой государственной цели, как я понимаю. Целью обработки различных кодировок, если вы пытаетесь преобразовать их между собой, является понимание того, что такое исходная кодировка, а затем преобразовать ее в unicode с использованием этой исходной кодировки, а затем преобразовать ее в нужную кодировку. Unicode является базой, а кодировки - отображением подмножеств этой базы. utf_8 имеет место для каждого символа в юникоде, но поскольку они не находятся на том же месте, что, например, latin_1, строка, закодированная в utf_8 и отправленная в консоль latin_1, не будет выглядеть так, как вы ожидаете. В питона процесс получения в юникод и в другой кодировке выглядит следующим образом:

str.decode('source_encoding').encode('desired_encoding') 

или если Обл уже в юникодом

str.encode('desired_encoding') 

Для SQLite я на самом деле не хочу, чтобы кодировать его снова, Я хотел расшифровать его и оставить в формате Unicode. Вот четыре вещи, которые вам, возможно, нужно знать, когда вы пытаетесь работать с юникодом и кодировками в python.

  1. Кодирование строки, с которой вы хотите работать, и кодировку, которую вы хотите получить.
  2. Системное кодирование.
  3. Консольное кодирование.
  4. Кодирование исходного файла

Elaboration:

(1) Когда вы читаете строку из источника, он должен иметь некоторую кодировку, как latin_1 или UTF_8. В моем случае я получаю строки из имен файлов, поэтому, к сожалению, я могу получить какую-либо кодировку. Windows XP использует UCS-2 (система Unicode) как свой собственный тип строки, который мне кажется изменчивым. К счастью для меня, символы в большинстве имен файлов не состоят из более чем одного типа кодировки источника, и я думаю, что все мои были либо полностью latin_1, полностью utf_8, либо просто ascii (который является подмножеством обоих те). Поэтому я просто прочитал их и расшифровал, как будто они все еще были в latin_1 или utf_8. Возможно, однако, что вы можете иметь latin_1 и utf_8 и любые другие символы, смешанные вместе в имени файла в Windows. Иногда эти персонажи могут появляться в виде ящиков, иногда они просто выглядят искалеченными, а в других случаях они выглядят правильными (акцентированные персонажи и многое другое). Двигаемся дальше.

(2) Python имеет системную кодировку по умолчанию, которая устанавливается при запуске питона и не может быть изменена во время выполнения. См. here. Грязные резюме ... ну вот файл я добавил:

\# sitecustomize.py 
\# this file can be anywhere in your Python path, 
\# but it usually goes in ${pythondir}/lib/site-packages/ 
import sys 
sys.setdefaultencoding('utf_8') 

Эта система кодирования является тот, который привыкает при использовании юникода («ул») функции без каких-либо других параметров кодирования. С другой стороны, python пытается декодировать «str» в unicode на основе системной кодировки по умолчанию.

(3) Если вы используете IDLE или пиктон командной строки, я думаю, что ваша консоль отобразится в соответствии с системной кодировкой по умолчанию. По какой-то причине я использую pydev с eclipse, поэтому мне нужно было войти в мои настройки проекта, отредактировать свойства конфигурации запуска моего тестового скрипта, перейти на вкладку «Общие» и сменить консоль с латинского-1 на utf-8, чтобы Я мог визуально подтвердить, что я делаю, работает.

(4) Если вы хотите иметь несколько тестовых строк, например

test_str = "ó" 

в исходном коде, то вы должны сказать питона, какие кодировки Вы используете в этом файле. (FYI: когда я неправильно набранный кодировку я должен был Ctrl-Z, потому что мой файл стал нечитаемым.) Это легко осуществить, поместив линию как и в верхней части вашего кода файла источника:

# -*- coding: utf_8 -*- 

Если вы дон «т есть эта информация, попытки питона синтаксического кода в ASCII по умолчанию и так:

SyntaxError: Non-ASCII character '\xf3' in file _redacted_ on line 81, but no encoding declared; see http://www.python.org/peps/pep-0263.html for details 

После того, как ваша программа работает правильно, или, если вы не используете консоль питона или любую другую консоль, чтобы посмотреть на выходе, то вы, вероятно, действительно заботитесь только о №1 в списке. Системное умолчание и консольное кодирование не так важны, если вам не нужно смотреть на вывод и/или использовать встроенную функцию unicode() (без каких-либо параметров кодирования) вместо функции string.decode(). Я написал демо-функцию, которую я вставляю в дно этого гигантского беспорядка, который, я надеюсь, правильно демонстрирует элементы в моем списке. Вот некоторые из результатов, когда я запускаю символ «-» через демонстрационную функцию, показывая, как различные методы реагируют на символ как на вход.Моя кодировка системы и вывод консоли оба устанавливаются в UTF_8 для этого запуска:

'�' = original char <type 'str'> repr(char)='\xf3' 
'?' = unicode(char) ERROR: 'utf8' codec can't decode byte 0xf3 in position 0: unexpected end of data 
'ó' = char.decode('latin_1') <type 'unicode'> repr(char.decode('latin_1'))=u'\xf3' 
'?' = char.decode('utf_8') ERROR: 'utf8' codec can't decode byte 0xf3 in position 0: unexpected end of data 

Теперь я изменить систему и кодирование консольного latin_1, и я получаю этот выход за тот же вход:

'ó' = original char <type 'str'> repr(char)='\xf3' 
'ó' = unicode(char) <type 'unicode'> repr(unicode(char))=u'\xf3' 
'ó' = char.decode('latin_1') <type 'unicode'> repr(char.decode('latin_1'))=u'\xf3' 
'?' = char.decode('utf_8') ERROR: 'utf8' codec can't decode byte 0xf3 in position 0: unexpected end of data 

Обратите внимание, что символ «оригинал» отображается правильно, и встроенная функция unicode() работает сейчас.

Теперь я меняю выход на консоль обратно на utf_8.

'�' = original char <type 'str'> repr(char)='\xf3' 
'�' = unicode(char) <type 'unicode'> repr(unicode(char))=u'\xf3' 
'�' = char.decode('latin_1') <type 'unicode'> repr(char.decode('latin_1'))=u'\xf3' 
'?' = char.decode('utf_8') ERROR: 'utf8' codec can't decode byte 0xf3 in position 0: unexpected end of data 

Здесь все по-прежнему работает так же, как в прошлый раз, но консоль не может отображать вывод правильно. И т. Д. В приведенной ниже функции также отображается дополнительная информация о том, что это и, мы надеемся, поможет кому-то выяснить, где разрыв в их понимании. Я знаю, что вся эта информация находится в других местах и ​​более подробно рассмотрена там, но я надеюсь, что это станет хорошей отправной точкой для тех, кто пытается получить кодирование с помощью python и/или sqlite. Идеи велики, но иногда исходный код может сэкономить вам день или два, пытаясь выяснить, какие функции делают.

Отказ от ответственности: Я не специалист по кодированию, я собрал это вместе, чтобы помочь себе. Я продолжал строить его, когда я, вероятно, начал передавать функции в качестве аргументов, чтобы избежать избыточного кода, поэтому, если можно, я сделаю его более кратким. Кроме того, utf_8 и latin_1 никоим образом не являются единственными схемами кодирования, они - только те два, с которыми я играл, потому что я думаю, что они обрабатывают все, что мне нужно. Добавьте свои собственные схемы кодирования в демонстрационную функцию и протестируйте свой собственный вход.

Еще одна вещь: есть apparently crazy application developers, что затрудняет жизнь в Windows.

#!/usr/bin/env python 
# -*- coding: utf_8 -*- 

import os 
import sys 

def encodingDemo(str): 
    validStrings =() 
    try:   
     print "str =",str,"{0} repr(str) = {1}".format(type(str), repr(str)) 
     validStrings += ((str,""),) 
    except UnicodeEncodeError as ude: 
     print "Couldn't print the str itself because the console is set to an encoding that doesn't understand some character in the string. See error:\n\t", 
     print ude 
    try: 
     x = unicode(str) 
     print "unicode(str) = ",x 
     validStrings+= ((x, " decoded into unicode by the default system encoding"),) 
    except UnicodeDecodeError as ude: 
     print "ERROR. unicode(str) couldn't decode the string because the system encoding is set to an encoding that doesn't understand some character in the string." 
     print "\tThe system encoding is set to {0}. See error:\n\t".format(sys.getdefaultencoding()), 
     print ude 
    except UnicodeEncodeError as uee: 
     print "ERROR. Couldn't print the unicode(str) because the console is set to an encoding that doesn't understand some character in the string. See error:\n\t", 
     print uee 
    try: 
     x = str.decode('latin_1') 
     print "str.decode('latin_1') =",x 
     validStrings+= ((x, " decoded with latin_1 into unicode"),) 
     try:   
      print "str.decode('latin_1').encode('utf_8') =",str.decode('latin_1').encode('utf_8') 
      validStrings+= ((x, " decoded with latin_1 into unicode and encoded into utf_8"),) 
     except UnicodeDecodeError as ude: 
      print "The string was decoded into unicode using the latin_1 encoding, but couldn't be encoded into utf_8. See error:\n\t", 
      print ude 
    except UnicodeDecodeError as ude: 
     print "Something didn't work, probably because the string wasn't latin_1 encoded. See error:\n\t", 
     print ude 
    except UnicodeEncodeError as uee: 
     print "ERROR. Couldn't print the str.decode('latin_1') because the console is set to an encoding that doesn't understand some character in the string. See error:\n\t", 
     print uee 
    try: 
     x = str.decode('utf_8') 
     print "str.decode('utf_8') =",x 
     validStrings+= ((x, " decoded with utf_8 into unicode"),) 
     try:   
      print "str.decode('utf_8').encode('latin_1') =",str.decode('utf_8').encode('latin_1') 
     except UnicodeDecodeError as ude: 
      print "str.decode('utf_8').encode('latin_1') didn't work. The string was decoded into unicode using the utf_8 encoding, but couldn't be encoded into latin_1. See error:\n\t", 
      validStrings+= ((x, " decoded with utf_8 into unicode and encoded into latin_1"),) 
      print ude 
    except UnicodeDecodeError as ude: 
     print "str.decode('utf_8') didn't work, probably because the string wasn't utf_8 encoded. See error:\n\t", 
     print ude 
    except UnicodeEncodeError as uee: 
     print "ERROR. Couldn't print the str.decode('utf_8') because the console is set to an encoding that doesn't understand some character in the string. See error:\n\t",uee 

    print 
    print "Printing information about each character in the original string." 
    for char in str: 
     try: 
      print "\t'" + char + "' = original char {0} repr(char)={1}".format(type(char), repr(char)) 
     except UnicodeDecodeError as ude: 
      print "\t'?' = original char {0} repr(char)={1} ERROR PRINTING: {2}".format(type(char), repr(char), ude) 
     except UnicodeEncodeError as uee: 
      print "\t'?' = original char {0} repr(char)={1} ERROR PRINTING: {2}".format(type(char), repr(char), uee) 
      print uee  

     try: 
      x = unicode(char)   
      print "\t'" + x + "' = unicode(char) {1} repr(unicode(char))={2}".format(x, type(x), repr(x)) 
     except UnicodeDecodeError as ude: 
      print "\t'?' = unicode(char) ERROR: {0}".format(ude) 
     except UnicodeEncodeError as uee: 
      print "\t'?' = unicode(char) {0} repr(char)={1} ERROR PRINTING: {2}".format(type(x), repr(x), uee) 

     try: 
      x = char.decode('latin_1') 
      print "\t'" + x + "' = char.decode('latin_1') {1} repr(char.decode('latin_1'))={2}".format(x, type(x), repr(x)) 
     except UnicodeDecodeError as ude: 
      print "\t'?' = char.decode('latin_1') ERROR: {0}".format(ude) 
     except UnicodeEncodeError as uee: 
      print "\t'?' = char.decode('latin_1') {0} repr(char)={1} ERROR PRINTING: {2}".format(type(x), repr(x), uee) 

     try: 
      x = char.decode('utf_8') 
      print "\t'" + x + "' = char.decode('utf_8') {1} repr(char.decode('utf_8'))={2}".format(x, type(x), repr(x)) 
     except UnicodeDecodeError as ude: 
      print "\t'?' = char.decode('utf_8') ERROR: {0}".format(ude) 
     except UnicodeEncodeError as uee: 
      print "\t'?' = char.decode('utf_8') {0} repr(char)={1} ERROR PRINTING: {2}".format(type(x), repr(x), uee) 

     print 

x = 'ó' 
encodingDemo(x) 

Большое спасибо за ответы ниже и особенно @John Machin за то, что вы так хорошо ответили.

ответ

34

I'm still ignorant of whether there is a way to correctly convert 'ó' from latin-1 to utf-8 and not mangle it

магнезия() и unicodedata.name() являются вашими друзьями, когда дело доходит до отладки таких проблем:

>>> oacute_latin1 = "\xF3" 
>>> oacute_unicode = oacute_latin1.decode('latin1') 
>>> oacute_utf8 = oacute_unicode.encode('utf8') 
>>> print repr(oacute_latin1) 
'\xf3' 
>>> print repr(oacute_unicode) 
u'\xf3' 
>>> import unicodedata 
>>> unicodedata.name(oacute_unicode) 
'LATIN SMALL LETTER O WITH ACUTE' 
>>> print repr(oacute_utf8) 
'\xc3\xb3' 
>>> 

Если вы отправляете oacute_utf8 на терминал, который настроен для latin1, вы получите A-тильду, а затем верхний индекс-3.

I switched to Unicode strings.

Что вы называете строками Unicode? UTF-16?

What gives? After reading this, describing exactly the same situation I'm in, it seems as if the advice is to ignore the other advice and use 8-bit bytestrings after all.

Я не представляю, как это кажется вам. Рассказ, который был передан, заключался в том, что юникодными объектами в кодировке Python и UTF-8 в базе данных были пути. Однако Мартин ответил на исходный вопрос, предоставив метод («текстовая фабрика») для OP, чтобы он мог использовать latin1 - это НЕ составляло рекомендации!

Update в ответ на эти дополнительные вопросы, поднятые в комментарии:

I didn't understand that the unicode characters still contained an implicit encoding. Am I saying that right?

No.Кодировка - это сопоставление между Unicode и чем-то другим, и наоборот. Символ Unicode не имеет кодировки, неявной или другой.

It looks to me like unicode("\xF3") and "\xF3".decode('latin1') are the same when evaluated with repr().

Скажите, что? Это не выглядит, как он мне:

>>> unicode("\xF3") 
Traceback (most recent call last): 
    File "<stdin>", line 1, in <module> 
UnicodeDecodeError: 'ascii' codec can't decode byte 0xf3 in position 0: ordinal 
not in range(128) 
>>> "\xF3".decode('latin1') 
u'\xf3' 
>>> 

Возможно, вы имели в виду: u'\xf3' == '\xF3'.decode('latin1') ... это, конечно, верно.

Также верно, что unicode(str_object, encoding) делает то же самое, что и str_object.decode(encoding) ... включая вдувание, когда подается неправильное кодирование.

Is that a happy circumstance

Это первые 256 символов Unicode одинаковы, код для кода, так как 256 символов latin1 является хорошей идеей. Поскольку все 256 возможных символов latin1 отображаются в Unicode, это означает, что ЛЮБЫЙ 8-разрядный байт, ANY Python str-объект может быть декодирован в unicode без исключения исключения. Это так и должно быть.

Однако существуют определенные люди, которые путают два совершенно разных понятия: «мой сценарий заканчивается без каких-либо исключений» и «мой скрипт без ошибок». Для них latin1 - это «ловушка и заблуждение».

Другими словами, если у вас есть файл, который фактически закодирован в cp1252 или gbk или koi8-u или что-то еще, и вы декодируете его с помощью latin1, получившийся Unicode будет полным мусором, а Python (или любой другой язык) не будет отметьте ошибку - он не знает, что вы совершили глупость.

or is unicode("str") going to always return the correct decoding?

Просто так, с кодировкой по умолчанию будучи ASCII, то в этом будет возвращать правильный юникод, если файл на самом деле кодируется в ASCII. В противном случае он взорвется.

Аналогичным образом, если вы указали правильную кодировку, или то, что является надмножеством правильной кодировки, вы получите правильный результат. В противном случае вы получите бред или исключение.

Вкратце: ответ отрицательный.

If not, when I receive a python str that has any possible character set in it, how do I know how to decode it?

Если объект str является допустимым XML-документом, он будет указан спереди. По умолчанию используется UTF-8. Если это правильно построенная веб-страница, она должна быть указана спереди (найдите «charset»). К сожалению, многие авторы веб-страниц лежат через их зубы (ISO-8859-1 aka latin1, должен быть Windows-1252 aka cp1252, не тратьте ресурсы, пытающиеся декодировать gb2312, вместо этого используйте gbk). Вы можете получить подсказки от национальности/языка веб-сайта.

UTF-8 всегда стоит попробовать. Если данные ascii, это будет нормально работать, потому что ascii - это подмножество utf8. Строка текста, написанная с использованием символов, отличных от ascii, и была закодирована в кодировке, отличной от utf8, почти наверняка завершится с исключением, если вы попытаетесь декодировать ее как utf8.

Все приведенные выше эвристики, а также множество статистических данных заключены в chardet, модуль для угадывания кодировки произвольных файлов. Обычно это работает хорошо. Однако вы не можете сделать программное обеспечение идиотским. Например, если вы объединяете файлы данных, написанные на некоторых с кодировкой A, а некоторые с кодировкой B, и подаете результат в chardet, ответ скорее всего будет кодировать C с пониженным уровнем достоверности, например. 0.8. Всегда проверяйте доверительную часть ответа.

Если все остальное терпит неудача:

(1) Попробуйте спросить здесь, с небольшой выборкой из передней части ваших данных ... print repr(your_data[:400]) ... и независимо от обеспечения информации о своем происхождении, что у вас есть.

(2) Недавнее исследование России в techniques for recovering forgotten passwords представляется вполне применимым для вывода неизвестных кодировок.

Update 2 BTW, это не о времени вы открыли еще один вопрос -)

One more thing: there are apparently characters that Windows uses as Unicode for certain characters that aren't the correct Unicode for that character, so you may have to map those characters to the correct ones if you want to use them in other programs that are expecting those characters in the right spot.

Это не Windows, что делает это; это куча сумасшедших разработчиков приложений. Вы, возможно, более понятным причинам не перефразировать, но цитирует открывающий абзац effbot статьи, что вы упомянули:

Some applications add CP1252 (Windows, Western Europe) characters to documents marked up as ISO 8859-1 (Latin 1) or other encodings. These characters are not valid ISO-8859-1 characters, and may cause all sorts of problems in processing and display applications.

фона:

Диапазон U + 0000 до U + 001F включительно обозначается в Unicode, как " C0 ". Они также существуют в ASCII и latin1 с теми же значениями. Они включают такие знакомые вещи, как возврат каретки, подача строк, звонок, обратное пространство, вкладка и другие, которые используются редко.

Диапазон U + 0080 до U + 009F включительно обозначается в Unicode как «C1 Control Characters». Они также существуют в latin1 и включают в себя 32 символа, которые никто из сторонних unicode.org не может представить для использования.

Следовательно, если вы запустили счетчик символов в ваших данных в формате unicode или latin1, и вы найдете любые символы в этом диапазоне, ваши данные повреждены. Нет универсального решения; это зависит от того, как он стал поврежденным. Символы могут имеют то же значение, что и символы cp1252 в тех же позициях, и поэтому решение effbot будет работать. В другом случае, который я недавно рассматривал, хитроумные символы, по-видимому, были вызваны объединением текстовых файлов, закодированных в UTF-8, и другой кодировкой, которые необходимо было вывести на основе буквенных частот на (человеческом) языке, файлы были

+0

Я имел мою установку терминала для latin1, поэтому я изменил это. Когда вы спрашиваете, что я называю строками Unicode, я использовал метод unicode() на странице, в которой я читал. Я не понимал, что символы Unicode по-прежнему содержат неявное кодирование. Я говорю это правильно? Мне кажется, что unicode ("\ xF3") и "\ xF3" .decode ('latin1') одинаковы при оценке с помощью функции repr(). Является ли это счастливым обстоятельством или является unicode («str»), который всегда возвращает правильное декодирование? Если нет, когда я получаю python str, у которого есть какой-либо возможный набор символов, как я знаю, как его декодировать? –

+0

Еще раз спасибо. Я думаю, ответ на ваш вопрос «Что вы называете строками Unicode? UTF-16?» «независимо от того, какой oacute_unicode». Неужели я пропустил какой-то аспект вашего вопроса, который я должен понимать? Я расшифровал строки, которые я получил от имен файлов, и отправил их в db в этой форме. Я также заказал десять бункеров Пентагона так скоро, что у меня должны быть возможности военного декодирования, и питон будет лишним. –

+0

Я просто проверял, что вы действительно имели в виду объекты юникода Python == какой oacute_unicode, а не UTF-16, который является еще одной возможностью кодирования в базах данных SQLite и которые некоторые называют «Unicode». –

7

Конечно, есть. Но ваши данные уже сломаны в базе данных, так что вам нужно исправить:

>>> print u'Sigur Rós'.encode('latin-1').decode('utf-8') 
Sigur Rós 
20

UTF-8 - это кодировка баз данных SQLite по умолчанию. Это отображается в таких ситуациях, как «SELECT CAST (x'52C3B373« AS TEXT »)». Однако библиотека SQLite C фактически не проверяет, является ли строка, вставленная в БД, действительной UTF-8.

Если вы вставляете объект unicode Python (или объект str в 3.x), библиотека sqlite3 Python автоматически преобразует его в UTF-8. Но если вы вставляете объект str, он будет считать строка UTF-8, потому что Python 2.x «str» не знает его кодировки. Это одна из причин предпочтения строк Unicode.

Однако, это не поможет вам, если ваши данные сломаны для начала.

Чтобы исправить свои данные, сделать

db.create_function('FIXENCODING', 1, lambda s: str(s).decode('latin-1')) 
db.execute("UPDATE TheTable SET TextColumn=FIXENCODING(CAST(TextColumn AS BLOB))") 

для каждого текстового столбца в базе данных.

+0

Это действительно полезно. Мне это не нужно прямо сейчас, потому что я просто пытаюсь понять этот материал, и мой db является одноразовым, но все же это заслуживает повышения в качестве полезности. –

+0

Я написал короткий скрипт, который использует этот метод для повторного кодирования всех столбцов 'text',' clob' и 'char' во всех таблицах целевой базы данных. http://stackoverflow.com/a/29048500/1191425. –

18

Я установил эту проблему pysqlite установки:

conn.text_factory = lambda x: unicode(x, 'utf-8', 'ignore') 

По умолчанию text_factory установлен в Unicode(), который будет использовать текущую кодировку по умолчанию (ASCII на моей машине)

+0

Хотя ошибка «text_factory» упоминается в ошибке, которую я получаю, я не могу найти ссылку на нее в онлайн-документах SQL Alchemy v0.7.6 по адресу http://docs.sqlalchemy.org/en/latest/ – RobM

+0

Я сделал это, но это по-прежнему жалуется. – fiatjaf

+0

Отлично! Просто небольшое изменение в моем случае: это удаление символов с акцентом ... поэтому я использовал 'conn.text_factory = lambda x: x.decode ('latin-1')' – luc

2

Моего Юникода проблемы с Python 2.x (Python 2.7.6, чтобы быть конкретным) исправил:

#!/usr/bin/env python 
# -*- coding: utf-8 -*- 

from __future__ import unicode_literals 
import sys 
reload(sys) 
sys.setdefaultencoding('utf-8') 

Он также решил ошибку вы упоминая прямо в начале поста:

sqlite3.ProgrammingError: You must not use 8-bit bytestrings unless ...

EDIT

sys.setdefaultencoding является грязный хак. Да, он может решить проблемы UTF-8, но все идет с ценой. Для получения более подробной информации обратитесь к следующим ссылкам:

+1

Не использовать 'sys.setdefaultencoding() '. Это ужасное грузило, и оно служит только для того, чтобы * временно скрыть поломку *. Это сломает другие вещи. Вы просто напугаете синяки, а не перестаете удары ударами. Прекратите получать перфорации и правильно обрабатывайте Юникод. –

Смежные вопросы