Форум сайта python.su
И снова про юникод.
Есть файл в UTF-8. Вывод на консоль работает замечательно, но при попытке перенаправиить в файл возникает ошибка.
$ locale
LANG=ru_RU.UTF-8
LC_CTYPE=“ru_RU.UTF-8”
LC_NUMERIC=“ru_RU.UTF-8”
LC_TIME=“ru_RU.UTF-8”
LC_COLLATE=“ru_RU.UTF-8”
LC_MONETARY=“ru_RU.UTF-8”
LC_MESSAGES=“ru_RU.UTF-8”
LC_PAPER=“ru_RU.UTF-8”
LC_NAME=“ru_RU.UTF-8”
LC_ADDRESS=“ru_RU.UTF-8”
LC_TELEPHONE=“ru_RU.UTF-8”
LC_MEASUREMENT=“ru_RU.UTF-8”
LC_IDENTIFICATION=“ru_RU.UTF-8”
LC_ALL=
# -*- coding: utf-8 -*-
data = open('test.htm').read().decode('utf-8')
print type(data) # <type 'unicode'>
print data # UnicodeEncodeError: 'ascii' codec can't encode character u'\u2019' in position 229: ordinal not in range(128)
Офлайн
> ‘ascii’ codec can't encode
Тут без вариантов: print data.encode('utf-8')
А как ты с файлом поступаешь? ./my.py > my.txt?
Не знаю почему работает с консолью, не должно работать.
Ни в файл, ни на консоль нельзя выводить unicode. Для винды руками кодируй в cp866, для Linux - locale.getpreferredencoding(). Или как-то так.
..bw
Отредактировано (Дек. 7, 2008 04:58:23)
Офлайн
bw
на консоль нельзя выводить unicode.
# -*- coding: utf-8 -*-
print """Ну почему же?
У меня в MacOS X Leopard всё работает. И в Gentoo сборки 2004-го года тоже проблем нет...
Метод __str__ сам всё декодирует в кодировку модуля (смотреть заголовок).
Может дело как всегда в кодировке терминала?
"""
ttys001 /Users/zzz/Desktop $ python untitled.py
Ну почему же?
У меня в MacOS X Leopard всё работает. И в Gentoo сборки 2004-го года тоже проблем нет…
Метод __str__ сам всё декодирует в кодировку модуля (смотреть заголовок).
Может дело как всегда в кодировке терминала?
Офлайн
Для начала, в твоём примере str, а не unicode :-).
Нельзя, не потому что оно не сработает у тебя и у меня, а потому что может не сработать у него.
Если, ты о unicode__str__, то он, будет кодировать в ascii. Вывод print'ом получается скорее всего потому, что на лету происходит кодирование юникода в строку, в соответствии с локалью.
Почему автору удается сделать вывод юникода на консоль и не удается записать в файл (указанным мною выше способом) я не знаю. У меня всё нормально с этим (Linux).
..bw
Офлайн
bwТьфу блин! ‘u’ куда-то потерял! Только не спрашивай как… :-)
Для начала, в твоём примере str, а не unicode :-).
bwНа счёт __str__ я действительно заглючил… Большое сорри. Наверное это было уже после потери ‘u’.
Если, ты о unicode__str__, то он, будет кодировать в ascii.
bwИменно так. Поэтому проблем с выводом, которые постоянно здесь поднимаются, мне просто не понять. Ну с виндой ясно – у них свои глюки, но в любой *nix можно нормально настроить локаль с кодировкой консоли и забыть об этих проблемах раз и навсегда.
Вывод print'ом получается скорее всего потому, что на лету происходит кодирование юникода в строку, в соответствии с локалью.
Офлайн