Уведомления

Группа в Telegram: @pythonsu

#1 Апрель 21, 2010 14:55:58

Evgenus
От:
Зарегистрирован: 2010-04-21
Сообщения: 2
Репутация: +  0  -
Профиль   Отправить e-mail  

В чем проблема с выводом unicode

Изучаю Python по книге Марка Саммерфилда “Программирование на Python 3”. Выполняя пример столкнулся с ошибкой отсутствующей в книге.

Пример с выводом результата в консоль.

import sys
import unicodedata

def print_unicode_table(word):
print("decimal hex chr {0:^40}".format("name"))
print("------- ----- --- {0:-<40}".format(""))

code = ord(" ")
end = sys.maxunicode

while code < end:
c = chr(code)
name = unicodedata.name(c, "*** unknown ***")
if word is None or word in name.lower():
print("{0:7} {0:5X} {0:^3c} {1}".format(code, name.title()))
code += 1

word = None
if len(sys.argv) > 1:
if sys.argv[1] in ("-h", "--help"):
print("usage: {0} [string]".format(sys.argv[0]))
word = 0
else:
word = sys.argv[1].lower()
if word != 0:
print_unicode_table(word)
Выдает ошибку:
Traceback (most recent call last):
File “C:\Python31\print_unicode.py”, line 26, in <module>
print_unicode_table(word)
File “C:\Python31\print_unicode.py”, line 15, in print_unicode_table
print(“{0:7} {0:5X} {0:^3c} {1}”.format(code, name.title()))
File “C:\Python31\lib\encodings\cp866.py”, line 19, in encode
return codecs.charmap_encode(input,self.errors,encoding_map)
UnicodeEncodeError: ‘charmap’ codec can't encode character ‘\xa1’ in position 15
: character maps to <undefined>
При этом есть пример с выводом в текстовый файл:

import sys
import unicodedata


def print_unicode_table(word):
filename = "unicode-table.txt"
fh = open(filename, "w", encoding="utf8")
fh.write("decimal hex chr {0:^40}\n".format("name"))
fh.write("------- ----- --- {0:-<40}\n".format(""))

code = ord(" ")
end = min(0xD800, sys.maxunicode) # Stop at surrogate pairs

while code < end:
c = chr(code)
name = unicodedata.name(c, "*** unknown ***")
if word is None or word in name.lower():
fh.write("{0:7} {0:5X} {0:^3c} {1}\n".format(
code, name.title()))
code += 1
print("wrote results to", filename)


word = None
if len(sys.argv) > 1:
if sys.argv[1] in ("-h", "--help"):
print("usage: {0} [string]".format(sys.argv[0]))
word = 0
else:
word = sys.argv[1].lower()
if word != 0:
print_unicode_table(word)
Там ошибок никаких нет.

Не могу понять в чем причина ошибки с выводом на консоль и как ее избежать.



Офлайн

#2 Апрель 21, 2010 17:05:01

o7412369815963
От:
Зарегистрирован: 2009-06-17
Сообщения: 1986
Репутация: +  32  -
Профиль   Отправить e-mail  

В чем проблема с выводом unicode

попробуй подставить ‘u’

print(u"{0:7} {0:5X} {0:^3c} {1}".format(code, name.title()))

Офлайн

#3 Апрель 21, 2010 17:06:50

dartNNN
От:
Зарегистрирован: 2009-12-08
Сообщения: 199
Репутация: +  0  -
Профиль   Отправить e-mail  

В чем проблема с выводом unicode

Мыслю: в первом отрывке никак не указана кодировка, т.е. в начале следовало бы прописать:
# -*- coding: utf-8 -*-
Т.е. четко указать, что исходный текст идет в уникоде. В винде в командной строке по умолчанию используется кодировка ascii
так как во втором примере все пишется в файл с заданной кодировкой, то и проблем не возникает
Для полноты ощущений можно глянуть http://python.su/forum/viewtopic.php?pid=48195#p48195



Офлайн

#4 Апрель 21, 2010 17:07:59

dartNNN
От:
Зарегистрирован: 2009-12-08
Сообщения: 199
Репутация: +  0  -
Профиль   Отправить e-mail  

В чем проблема с выводом unicode

o7412369815963
попробуй подставить ‘u’
Что-то вы не внимательны это не второй питон, а третий



Офлайн

#5 Апрель 21, 2010 20:34:56

o7412369815963
От:
Зарегистрирован: 2009-06-17
Сообщения: 1986
Репутация: +  32  -
Профиль   Отправить e-mail  

В чем проблема с выводом unicode

dartNNN
# -*- coding: utf-8 -*-
Т.е. четко указать, что исходный текст идет в уникоде.
не в уникоде, а в utf8

Офлайн

#6 Апрель 21, 2010 20:36:22

o7412369815963
От:
Зарегистрирован: 2009-06-17
Сообщения: 1986
Репутация: +  32  -
Профиль   Отправить e-mail  

В чем проблема с выводом unicode

dartNNN
o7412369815963
попробуй подставить ‘u’
Что-то вы не внимательны это не второй питон, а третий
а в 3-м как?

Офлайн

#7 Май 1, 2010 13:55:55

Evgenus
От:
Зарегистрирован: 2010-04-21
Сообщения: 2
Репутация: +  0  -
Профиль   Отправить e-mail  

В чем проблема с выводом unicode

1) Что дает закоментированная строка # -*- coding: utf-8 -*- ?
2) Т.к. все равно не заработало забил на это, но опять столкнулся с той же проблемой.
print(“ax\N{SUPERSCRIPT TWO} + bx + c = 0”)
В Досовской консоли не работает.
Как я понимаю в Досе используется ASCII, а в Винде UTF-8 Юникод. Вот как из Юникода перегнать в ASCII?



Офлайн

#8 Май 1, 2010 20:54:02

kt315e
От:
Зарегистрирован: 2009-12-27
Сообщения: 64
Репутация: +  0  -
Профиль   Отправить e-mail  

В чем проблема с выводом unicode

Может в досовской консоли кодировка досовская? А питон выводит в 1251?



Офлайн

#9 Май 2, 2010 13:28:09

UsCr
От:
Зарегистрирован: 2009-11-04
Сообщения: 216
Репутация: +  0  -
Профиль   Отправить e-mail  

В чем проблема с выводом unicode

Evgenus
1) Что дает закоментированная строка # -*- coding: utf-8 -*- ?
Она говорит что программа использует utf-8. Просто формат записи такой вот, со знака комментария начинается.

Может быть вот эта тема вам поможет?



Отредактировано (Май 2, 2010 13:28:23)

Офлайн

Board footer

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

Powered by DjangoBB

Lo-Fi Version