Debian lenny 5.0.3, соответственно родная кодировка - utf-8, python 2.5.2.
Считываю из файла в кодировке utf-8 строку, например, в переменную test:
>>> print test
Как дела?
>>> import sys
>>> sys.getdefaultencoding()
'ascii'
А теперь мы производим какое-либо действие над строкой. Например, split:
>>> print test.split()
['\xd0\x9a\xd0\xb0\xd0\xba', '\xd0\xb4\xd0\xb5\xd0\xbb\xd0\xb0?']
>>> print test.split()[0], test.split()[1]
Как дела?
А теперь сменим кодировку по умолчанию для питона так, как это показано тут: http://doweb.sloyko.com/index.php?/archives/22-Strah_i_nenavist_setdefaultencoding.html и убедимся, что в поведении питона ровным счётом ничего не изменилось.
Ссылку привёл на случай, если кто-то спросит, зачем перезагружать модуль sys.
>>> 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']
Это было бы очень удобно в процессе отладки. Перекодировать туда-сюда каждую строку тоже не дело. Писать функцию, перебирающую список и склеивающую из нужных элементов строку в случае необходимости отобразить её на экране - бред. Переходить сразу на третий (не знаю, есть ли там такие проблемы) не хочется, ибо не на каждом сервере найдётся третий. И ведь это не проблема какой-то конкретной версии. Проверил на соседней машине под убунтой (Python 2.6.4) - всё работает в точности так же. И ладно бы, дело было просто в отображении. Это серьёзно мешает жить:
>>> 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'