Форум сайта python.su
Добрый всем день. Я только начал изучать питон, но сразу столкнулся с проблемой кодировок. Бьюсь третий день, искал на форумах и далеко не только на этом, но нигде не нашёл внятных исчерпывающих ответов на свои вопросы. Надеюсь найти тут.
Debian lenny 5.0.3, соответственно родная кодировка - utf-8, python 2.5.2.
Считываю из файла в кодировке utf-8 строку, например, в переменную test:
>>> print test
Как дела?
>>> import sys
>>> sys.getdefaultencoding()
'ascii'
>>> print test.split()
['\xd0\x9a\xd0\xb0\xd0\xba', '\xd0\xb4\xd0\xb5\xd0\xbb\xd0\xb0?']
>>> print test.split()[0], test.split()[1]
Как дела?
>>> import sys
>>> reload(sys)
<module 'sys' (built-in)>
>>> sys.setdefaultencoding('utf-8')
>>> sys.getdefaultencoding()
'utf-8'
>>> print test
Как дела?
>>> print test.split()
['\xd0\x9a\xd0\xb0\xd0\xba', '\xd0\xb4\xd0\xb5\xd0\xbb\xd0\xb0?']
>>> print test.split()[0]
Как
>>> print test.split()[0], test.split()[1]
Как дела?
>>> test1 = 'Мама мыла раму'
>>> print test1
Мама мыла раму
>>> print test1.split()
['\xd0\x9c\xd0\xb0\xd0\xbc\xd0\xb0', '\xd0\xbc\xd1\x8b\xd0\xbb\xd0\xb0', '\xd1\x80\xd0\xb0\xd0\xbc\xd1\x83']
>>> [test, test1]
['\xd0\x9a\xd0\xb0\xd0\xba \xd0\xb4\xd0\xb5\xd0\xbb\xd0\xb0?', '\xd0\x9c\xd0\xb0\xd0\xbc\xd0\xb0 \xd0\xbc\xd1\x8b\xd0\xbb\xd0\xb0 \xd1\x80\xd0\xb0\xd0\xbc\xd1\x83']
>>> import sqlite3
>>> db = sqlite3.connect(':memory:')
>>> db.execute('create table list1 (field1, field2)')
<sqlite3.Cursor object at 0x7fca397bb7c0>
>>> tmp = (test.split()[0], test.split()[1])
>>> print tmp
('\xd0\x9a\xd0\xb0\xd0\xba', '\xd0\xb4\xd0\xb5\xd0\xbb\xd0\xb0?')
>>> db.execute("insert into list1 values (?, ?)", tmp )
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
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.
>>> sys.getdefaultencoding()
'utf-8'
Отредактировано (Март 27, 2010 09:27:49)
Офлайн
1. Юникод.
2. В каждом втором треде про кодировки говорят, что в случае такого вывода выводится repr списка.
3. Потому что в данном примере нет никакой обработки строк. Операции, которые вы используете, не имееют отношения к дефолтной кодировке. Правда, для юникодной консоли. В каком-нибудь виндовсе в консоль выводилсь бы неверно, постольку консоль там не юникодная.
4. Выводя каждый елемент отдельно. Повторюсь, при выводе списка выводитс repr - внутреннее представление этого самого списка.
Отредактировано (Март 27, 2010 09:37:27)
Офлайн
FerromanБольшое спасибо! Вы очень прояснили ситуацию. Во всём остальном яразобрался сам.
1. Юникод.
2. В каждом втором треде про кодировки говорят, что в случае такого вывода выводится repr списка.
Замечательно. Это я тоже понять могу.
3. Потому что в данном примере нет никакой обработки строк. Операции, которые вы используете, не имееют отношения к дефолтной кодировке. Правда, для юникодной консоли. В каком-нибудь виндовсе в консоль выводилсь бы неверно, постольку консоль там не юникодная.
4. Выводя каждый елемент отдельно. Повторюсь, при выводе списка выводитс repr - внутреннее представление этого самого списка.
>>> test = u'Мама мыла раму'
>>> test1 = 'Мама мыла раму'
>>> repr(test)
"u'\\u041c\\u0430\\u043c\\u0430 \\u043c\\u044b\\u043b\\u0430 \\u0440\\u0430\\u043c\\u0443'"
>>> repr(test1)
"'\\xd0\\x9c\\xd0\\xb0\\xd0\\xbc\\xd0\\xb0 \\xd0\\xbc\\xd1\\x8b\\xd0\\xbb\\xd0\\xb0 \\xd1\\x80\\xd0\\xb0\\xd0\\xbc\\xd1\\x83'"
>>> test == test1.decode("utf-8")
True
Офлайн
+1
Офлайн
from pprint import pprint
или писать на 3-ем питоне)))
Отредактировано (Март 29, 2010 11:41:31)
Офлайн