Проблема с кодировкой при записи в sqlite3
📁 python, ошибка, python2, ии
Пишу в Windows 7 на python 2.7.10.
#-*-coding: utf-8 -*-conn = db.connect('main.db')#conn.text_factory = strc = conn.cursor()c.execute('PRAGMA encoding=""UTF-8"";')c.execute('''CREATE TABLE IF NOT EXISTS user (login text, password text) ''')c.execute('''CREATE TABLE IF NOT EXISTS service (useame text, service_name text, service_login text, service_pwd text)''')print u""Добро пожаловать в менеджер паролей""print u""Разрешены только буквы латинского алфавита и цифры""name = raw_input(u""Представьтесь: "").strip()#name.decode('utf-8')c.execute(""SELECT COUNT(login) FROM user WHERE user.login=?"", (name,))Насколько мне известно формат строк в sqlite3 по умолчанию имеет кодировку utf-8. При попытке записать имя пользователя русскими буквами в базу sqlite3 получаю ошибку:
Traceback (most recent call last):
File ""D:/project/pwd/pwd.py"", line 30, in <module>c.execute(""SELECT COUNT(login) FROM user WHERE user.login=?"", (name,))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.
Если использовать name.decode('utf-8') ,то ошибка другая:
Traceback (most recent call last):
File ""D:/project/pwd/pwd.py"", line 29, in <module>name.decode('utf-8')
File ""C:\Python27\lib\encodings\utf_8.py"", line 16, indecoderetu codecs.utf_8_decode(input, errors, True)UnicodeDecodeError: 'utf8' codec can't decode byte 0xd1 in position 0: invalid continuation byte
Вычитал, что можно использовать conn.text_factory = str, при этом в базу пишутся русские буквы, но этого делать не рекомендуется и при этом буквы имеют вид:
Как же всё-таки записать в базу русские имена, чтобы они при этом выглядели нормально?
Попутно хочу спросить, как отловить сразу два exception (UnicodeDecodeError и TypeError) в конструкции try - exception которые возникают в случае, если пользователь ввёл не ту фразу с которой был зашифрован его пароль к какому-либо сервису:
try: print u'пароль \t- ', aes.decrypt(i[1]).decode('utf-8')except: UnicodeDecodeError(u'Неправильная секретная фраза') P.S. пробую так:
print name.decode('cp1251').encode('utf-8').decode('utf-8')печатает Сергей - т.е. как бы всё в utf-8, но ошибка всё равно есть:
Traceback (most recent call last):
File ""D:/project/pwd/pwd.py"", line 32, in <module>c.execute(""SELECT COUNT(login) FROM user WHERE user.login=?"", (name,))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.
Обновление
Пробую так:
name = 'Сергей'print name.decode('cp1251').encode('utf-8').decode('utf-8')Т. е. как бы всё в utf-8, но ошибка всё равно есть:
Traceback (most recent call last):
File ""D:/project/pwd/pwd.py"", line 32, in <module>c.execute(""SELECT COUNT(login) FROM user WHERE user.login=?"", (name,))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.
При работе с консолью в windows используется кодировка cp866. Именно по этой причине происходит ошибка кодирования.
Попробуйте перевести из cp866 в utf-8
name = name.decode('cp866').encode('utf-8') Войдите чтобы оставить ответ
Блоги