0
0 Комментариев

Пишу в Windows 7 на python 2.7.10.

#-*-coding: utf-8 -*-
conn = db.connect('main.db')
#conn.text_factory = str
c = 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
 (username 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
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
name.decode('utf-8')
File «C:\Python27\lib\encodings\utf_8.py», line 16, in decode
return 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
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
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.


Добавить комментарий