Уведомления

Группа в Telegram: @pythonsu

#1 Дек. 7, 2008 04:46:48

Mr.Floppy
От:
Зарегистрирован: 2007-12-07
Сообщения: 5
Репутация: +  0  -
Профиль   Отправить e-mail  

Unicode и UTF-8

И снова про юникод.
Есть файл в 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?) Ведь на консоль же вывод нормально работает.



Офлайн

#2 Дек. 7, 2008 04:55:46

bw
От:
Зарегистрирован: 2007-09-26
Сообщения: 938
Репутация: +  20  -
Профиль   Адрес электронной почты  

Unicode и UTF-8

> ‘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)

Офлайн

#3 Дек. 7, 2008 05:33:49

ZZZ
От: Москва
Зарегистрирован: 2008-04-03
Сообщения: 2161
Репутация: +  26  -
Профиль   Адрес электронной почты  

Unicode и UTF-8

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__ сам всё декодирует в кодировку модуля (смотреть заголовок).
Может дело как всегда в кодировке терминала?



Офлайн

#4 Дек. 7, 2008 07:21:48

bw
От:
Зарегистрирован: 2007-09-26
Сообщения: 938
Репутация: +  20  -
Профиль   Адрес электронной почты  

Unicode и UTF-8

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

..bw



Офлайн

#5 Дек. 8, 2008 00:58:21

ZZZ
От: Москва
Зарегистрирован: 2008-04-03
Сообщения: 2161
Репутация: +  26  -
Профиль   Адрес электронной почты  

Unicode и UTF-8

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

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

bw
Вывод print'ом получается скорее всего потому, что на лету происходит кодирование юникода в строку, в соответствии с локалью.
Именно так. Поэтому проблем с выводом, которые постоянно здесь поднимаются, мне просто не понять. Ну с виндой ясно – у них свои глюки, но в любой *nix можно нормально настроить локаль с кодировкой консоли и забыть об этих проблемах раз и навсегда.
Меня единственное, что раздражает в unicode, так это вывод repr. Можно было бы изменить малой кровью, то было бы всё замечательно. А как, вывод листа юникодов превращается в беспорядочный набор знаков!



Офлайн

Board footer

Модераторировать

Powered by DjangoBB

Lo-Fi Version