Найти - Пользователи
Полная версия: Unicode и UTF-8
Начало » Python для новичков » Unicode и UTF-8
1
Mr.Floppy
И снова про юникод.
Есть файл в 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)
Какие есть варианты, кроме ручного перекодирования всего вывода в UTF-8? (И что тогда будет на Windows?) Ведь на консоль же вывод нормально работает.
bw
> ‘ascii’ codec can't encode

Тут без вариантов: print data.encode('utf-8')
А как ты с файлом поступаешь? ./my.py > my.txt?
Не знаю почему работает с консолью, не должно работать.

Ни в файл, ни на консоль нельзя выводить unicode. Для винды руками кодируй в cp866, для Linux - locale.getpreferredencoding(). Или как-то так.

..bw
ZZZ
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__ сам всё декодирует в кодировку модуля (смотреть заголовок).
Может дело как всегда в кодировке терминала?
bw
Для начала, в твоём примере str, а не unicode :-).
Нельзя, не потому что оно не сработает у тебя и у меня, а потому что может не сработать у него.
Если, ты о unicode__str__, то он, будет кодировать в ascii. Вывод print'ом получается скорее всего потому, что на лету происходит кодирование юникода в строку, в соответствии с локалью.
Почему автору удается сделать вывод юникода на консоль и не удается записать в файл (указанным мною выше способом) я не знаю. У меня всё нормально с этим (Linux).

..bw
ZZZ
bw
Для начала, в твоём примере str, а не unicode :-).
Тьфу блин! ‘u’ куда-то потерял! Только не спрашивай как… :-)
Наверное когда решил на всякий случай протестить именно строку… Спать уж очень хотелось…

bw
Если, ты о unicode__str__, то он, будет кодировать в ascii.
На счёт __str__ я действительно заглючил… Большое сорри. Наверное это было уже после потери ‘u’.

bw
Вывод print'ом получается скорее всего потому, что на лету происходит кодирование юникода в строку, в соответствии с локалью.
Именно так. Поэтому проблем с выводом, которые постоянно здесь поднимаются, мне просто не понять. Ну с виндой ясно – у них свои глюки, но в любой *nix можно нормально настроить локаль с кодировкой консоли и забыть об этих проблемах раз и навсегда.
Меня единственное, что раздражает в unicode, так это вывод repr. Можно было бы изменить малой кровью, то было бы всё замечательно. А как, вывод листа юникодов превращается в беспорядочный набор знаков!
This is a "lo-fi" version of our main content. To view the full version with more information, formatting and images, please click here.
Powered by DjangoBB