Форум сайта python.su
я учусь писать прогараммы на питоне и вот мне пришлось использовать питон 2.6 а не 3.0 т.к. многие библиотеки ещё не пересобраны.
Как и следовало ожидать, я столкнулся с проблемой кодировок.
в 2.6:
# -*- coding: utf-8 -*-
>>> list1 = ["этот", "тот", ["он", "другой"]]
>>> list2 = ['пока', 'привет']
>>> list1
['\xd1\x8d\xd1\x82\xd0\xbe\xd1\x82', '\xd1\x82\xd0\xbe\xd1\x82', ['\xd0\xbe\xd0\xbd', '\xd0\xb4\xd1\x80\xd1\x83\xd0\xb3\xd0\xbe\xd0\xb9']]
>>> list2
['\xd0\xbf\xd0\xbe\xd0\xba\xd0\xb0', '\xd0\xbf\xd1\x80\xd0\xb8\xd0\xb2\xd0\xb5\xd1\x82']
>>> print list1
['\xd1\x8d\xd1\x82\xd0\xbe\xd1\x82', '\xd1\x82\xd0\xbe\xd1\x82', ['\xd0\xbe\xd0\xbd', '\xd0\xb4\xd1\x80\xd1\x83\xd0\xb3\xd0\xbe\xd0\xb9']]
>>> print list2
['\xd0\xbf\xd0\xbe\xd0\xba\xd0\xb0', '\xd0\xbf\xd1\x80\xd0\xb8\xd0\xb2\xd0\xb5\xd1\x82']
>>>
# -*- coding: utf-8 -*-
>>> list1
['этот', 'тот', ['он', 'другой']]
>>> list2
['пока', 'привет']
>>> print(list1)
['этот', 'тот', ['он', 'другой']]
>>> print(list2)
['пока', 'привет']
>>> import sys
>>> sys.stdout.encoding
# -*- coding: utf-8 -*-
# -*- coding: utf-8 -*-
print '1 ' 'привет мир'
print '2 ' u'Привет, Мир!'
y=['он','она',['они','оно']]
print '3', y
k=[u'он',u'она',[u'они',u'оно']]
print '4', k
>>>
1 привет мир
2 Привет, Мир!
3 ['\xd0\xbe\xd0\xbd', '\xd0\xbe\xd0\xbd\xd0\xb0', ['\xd0\xbe\xd0\xbd\xd0\xb8', '\xd0\xbe\xd0\xbd\xd0\xbe']]
4 [u'\u043e\u043d', u'\u043e\u043d\u0430', [u'\u043e\u043d\u0438', u'\u043e\u043d\u043e']]
>>>
# -*- coding: utf-8 -*-
import codecs, sys
outf = codecs.getwriter('cp1251')(sys.stdout, errors='replace')
sys.stdout = outf
print >> outf, u'Первый пошёл!'
print u'Второй пошёл!'
outf.write(u'Третий пошёл!\n')
#print '0 ' 'Привет, Мир!' ошибка
print '1 ' u'Привет, Мир!'
y=['он','она',['они','оно']]
print '2', y
k=[u'он',u'она',[u'они',u'оно']]
print '3', k
print >> outf,'4', k
#outf.write(k) ошибка
#outf.write(y) ошибка
>>>
Первый пошёл!
Второй пошёл!
Третий пошёл!
1 Привет, Мир!
2 ['\xd0\xbe\xd0\xbd', '\xd0\xbe\xd0\xbd\xd0\xb0', ['\xd0\xbe\xd0\xbd\xd0\xb8', '\xd0\xbe\xd0\xbd\xd0\xbe']]
3 [u'\u043e\u043d', u'\u043e\u043d\u0430', [u'\u043e\u043d\u0438', u'\u043e\u043d\u043e']]
4 [u'\u043e\u043d', u'\u043e\u043d\u0430', [u'\u043e\u043d\u0438', u'\u043e\u043d\u043e']]
>>>
# -*- coding: utf-8 -*-
import codecs, sys
code=sys.stdout.encoding
outf = codecs.getwriter(code)(sys.stdout, errors='replace')
sys.stdout = outf
print >> outf, u'Первый пошёл!'
print u'Второй пошёл!'
outf.write(u'Третий пошёл!\n')
#print '0 ' 'Привет, Мир!' ошибка
print '1 ' u'Привет, Мир!'
y=['он','она',['они','оно']]
print '2', y
k=[u'он',u'она',[u'они',u'оно']]
print '3', k
print '4', y
print >> outf,'4', k
print >> outf,'5', y
#outf.write(k) ошибка
#outf.write(y) ошибка
>>>
Первый пошёл!
Второй пошёл!
Третий пошёл!
1 Привет, Мир!
2 ['\xd0\xbe\xd0\xbd', '\xd0\xbe\xd0\xbd\xd0\xb0', ['\xd0\xbe\xd0\xbd\xd0\xb8', '\xd0\xbe\xd0\xbd\xd0\xbe']]
3 [u'\u043e\u043d', u'\u043e\u043d\u0430', [u'\u043e\u043d\u0438', u'\u043e\u043d\u043e']]
4 ['\xd0\xbe\xd0\xbd', '\xd0\xbe\xd0\xbd\xd0\xb0', ['\xd0\xbe\xd0\xbd\xd0\xb8', '\xd0\xbe\xd0\xbd\xd0\xbe']]
4 [u'\u043e\u043d', u'\u043e\u043d\u0430', [u'\u043e\u043d\u0438', u'\u043e\u043d\u043e']]
5 ['\xd0\xbe\xd0\xbd', '\xd0\xbe\xd0\xbd\xd0\xb0', ['\xd0\xbe\xd0\xbd\xd0\xb8', '\xd0\xbe\xd0\xbd\xd0\xbe']]
>>>
# -*- coding: utf-8 -*-
# Конечно в нормальной жизни этих коментариев тут нет
# Загрузить кодеки и библиотеку локалей, установить дефолтную локаль согласно
# переменной окружения LC_ALL.
import locale, codecs; locale.setlocale(locale.LC_ALL, '')
# Теперь в encoding положим текущая кодировку локали.
encoding = locale.getlocale()[1]
# Если кодировка не определилась - это винды. Там полюбому UTF-8 :)
if not encoding:
encoding = "utf-8"
# Установим дефолтную локаль. Финт с ушами reload() нужен потому что разработчики
# питона дюже умные и логично удаляют функцию setdefaultencoding при загрузке.
# Оно в общем то логично, но я же умный.
import sys;reload(sys);sys.setdefaultencoding(encoding)
# Установили кодеки для вывода в потоки согласно распорядку.
sys.stdout = codecs.getwriter(encoding)(sys.stdout, errors = "replace")
sys.stderr = codecs.getwriter(encoding)(sys.stderr, errors = "replace")
Python 2.6.1 (r261:67517, Dec 4 2008, 16:51:00) [MSC v.1500 32 bit (Intel)] on
win32
Type "help", "copyright", "credits" or "license" for more information.
>>> import locale, codecs; locale.setlocale(locale.LC_ALL, '')
'Russian_Russia.1251'
>>> encoding = locale.getlocale()[1]
>>> import sys;reload(sys);sys.setdefaultencoding(encoding)
<module 'sys' (built-in)>
>>> sys.stdout = codecs.getwriter(encoding)(sys.stdout, errors = "replace")
>>> sys.stderr = codecs.getwriter(encoding)(sys.stderr, errors = "replace")
>>> print 'hellou world'
hellou world
>>> y=['он','она',['они','оно']]
>>> y
['\xae\xad', '\xae\xad\xa0', ['\xae\xad\xa8', '\xae\xad\xae']]
>>> print y
['\xae\xad', '\xae\xad\xa0', ['\xae\xad\xa8', '\xae\xad\xae']]
>>> k=[u'он',u'она',[u'они',u'оно']]
>>> k
[u'\u043e\u043d', u'\u043e\u043d\u0430', [u'\u043e\u043d\u0438', u'\u043e\u043d\
u043e']]
>>> print k
[u'\u043e\u043d', u'\u043e\u043d\u0430', [u'\u043e\u043d\u0438', u'\u043e\u043d\
u043e']]
>>>
>>> t='привет тебе'
>>> t
'\xaf\xe0\xa8\xa2\xa5\xe2 \xe2\xa5\xa1\xa5'
>>> print t
ЇаЁў?в в?Ў?
>>> print t.decode('utf-8')#в SciTE этот код работает'
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
File "C:\Python26\lib\encodings\utf_8.py", line 16, in decode
return codecs.utf_8_decode(input, errors, True)
UnicodeDecodeError: 'utf8' codec can't decode byte 0xaf in position 0: unexpecte
d code byte
>>> print t.decode('cp1251')
ЇаЁў?в в?Ў?
>>> print t.decode('cp866')# в SciTE это не работает
привет тебе
>>> print encoding
1251
>>> print u'привет'
привет
>>> sys.stdout.encoding
'cp866'
>>> print type(sys.stdout.encoding)
<type 'str'>
# -*- coding: utf-8 -*-
# Конечно в нормальной жизни этих коментариев тут нет
# Загрузить кодеки и библиотеку локалей, установить дефолтную локаль согласно
# переменной окружения LC_ALL.
import locale, codecs; locale.setlocale(locale.LC_ALL, '')
# Теперь в encoding положим текущая кодировку локали.
encoding = locale.getlocale()[1]
print encoding
# Если кодировка не определилась - это винды. Там полюбому UTF-8 :)
if not encoding:
encoding = "utf-8"
# Установим дефолтную локаль. Финт с ушами reload() нужен потому что разработчики
# питона дюже умные и логично удаляют функцию setdefaultencoding при загрузке.
# Оно в общем то логично, но я же умный.
import sys;reload(sys);sys.setdefaultencoding(encoding)
# Установили кодеки для вывода в потоки согласно распорядку.
sys.stdout = codecs.getwriter(encoding)(sys.stdout, errors = "replace")
sys.stderr = codecs.getwriter(encoding)(sys.stderr, errors = "replace")
print '1 ' u'Привет, Мир!'
y=['он','она',['они','оно']]
print '2', y
k=[u'он',u'она',[u'они',u'оно']]
print '3', k
print '4', y
#print >> outf,'5', y
t='привет строка в юникод'
h=u'привет юникод'
h=t.decode('utf-8')
print type(h)
print type(t)
print t.decode('utf-8')
print t.decode('cp866')
print t.decode('cp1251')
print u"принт"
print k
print sys.stdout.encoding
print type(sys.stdout.encoding)
>pythonw -u "kodinglokal.py"
1251
1 Привет, Мир!
2 ['\xd0\xbe\xd0\xbd', '\xd0\xbe\xd0\xbd\xd0\xb0', ['\xd0\xbe\xd0\xbd\xd0\xb8', '\xd0\xbe\xd0\xbd\xd0\xbe']]
3 [u'\u043e\u043d', u'\u043e\u043d\u0430', [u'\u043e\u043d\u0438', u'\u043e\u043d\u043e']]
4 ['\xd0\xbe\xd0\xbd', '\xd0\xbe\xd0\xbd\xd0\xb0', ['\xd0\xbe\xd0\xbd\xd0\xb8', '\xd0\xbe\xd0\xbd\xd0\xbe']]
<type 'unicode'>
<type 'str'>
привет строка в юникод
???А???????В ?Б?В?А?????? ?? ?О??????????
привет строка в юникод
принт
[u'\u043e\u043d', u'\u043e\u043d\u0430', [u'\u043e\u043d\u0438', u'\u043e\u043d\u043e']]
None
<type 'NoneType'>
>Exit code: 0 Time: 0.210
>>> regular_string = ’обычная строка’
>>> type(regular_string)
<type ’str’>
>>> unicode_string = regular_string.decode(’utf-8’)
>>> type(unicode_string)
<type ’unicode’>
>>> unicode_string = u’юникод-строка’
>>> type(unicode_string)
<type ’unicode’>
>>> regular_string = unicode_string.encode(’utf-8’)
>>> type(regular_string)
<type ’str’>
Отредактировано (Апрель 11, 2009 19:16:51)
Офлайн
люди, то-ли я уж на столько ту что питон мне в и жисть не осилить, но вывести список кроме как собственной функцией я не могу. помогите пожалуйста, хотя бы с постановкой диагноза.
Офлайн
Да. Для вывода своих списков - писать собственные функции для вывода сложных объектов в файл (список - тоже сложный, не смейтесь).
Строки держать только в юникоде (преобразовывая в байты только на момент чтения/записи).
Ваша проблема на самом деле при обычной разработке случается крайне редко. Просто потому, что если уж нужно что-то писать в файл - сначала делается ручное преобразование в строку (байты) нужной кодировки. С форматированием и прочими необходимыми вещами. А когда есть правильно кодированные байты - они пишутся куда угодно без проблем.
Манипуляциии с setpreferreddefaultencoding - плохая идея.
В вашем случае не срабатывает преобразование list=>unicode.
__unicode__( self)
Called to implement unicode() builtin; should return a Unicode object. When this method is not defined, string conversion is attempted, and the result of string conversion is converted to Unicode using the system default encoding.
А list=>str режет локаль.
Так дела обстоят с 2.6
Офлайн
Андрей Светловне всегда :( http://python.su/forum/viewtopic.php?id=3548&p=3 последний пост… ни кто так и не сказал, что я делал не правильно…
… А когда есть правильно кодированные байты - они пишутся куда угодно без проблем. …
Офлайн
Этот элемент точно также на forum.vingrad.ru отжигает. Похож на тролля.
Офлайн
никакой я не тролль.
посмотри что отвечают людям про пробелему с кодировками:
Проблема много раз обсасывалась. Ищите на форуме
http://python.su/forum/viewtopic.php?id=4152
Сто раз обсуждалось на форуме… Попробуй воспользоваться поиском…
http://python.su/forum/viewtopic.php?id=4145
Не очень понятно что вы хотели сказат таким большим постом, тем более до сути вы так и не добралсь.
http://forum.vingrad.ru/forum/topic-255152/kw-python-%D0%BA%D0%BE%D0%B4%D0%B8%D1%80%D0%BE%D0%B2%D0%BA%D0%B8-%D0%B5%D0%BC%D1%8B-%D0%BA%D0%BE%D0%B4%D0%B8%D1%80%D0%BE%D0%B2%D0%BA%D0%B0%D0%BC%D0%B8.html
если бы с кодировками всё было так просто, то давно уже был бы написан на эту тему полноценный ответ который можно было бы новичкам давать ссылкой.
а ответа такого нет, и в большинстве своеём люди отвечают - “читай форум”
Офлайн
Андрей Светлов
печально что это не проработано. спасибо разобрался боле мение
Офлайн
Проработано в 3.0 и далее - по самое не могу. Но сейчас срочно переключаться на тройку не стоит. А в 2.7 изменений по локалям, затрагивающих проблему - не будет.
Офлайн