Форум сайта python.su
Изучаю 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)
Офлайн
попробуй подставить ‘u’
print(u"{0:7} {0:5X} {0:^3c} {1}".format(code, name.title()))
Офлайн
Мыслю: в первом отрывке никак не указана кодировка, т.е. в начале следовало бы прописать:
# -*- coding: utf-8 -*-
Т.е. четко указать, что исходный текст идет в уникоде. В винде в командной строке по умолчанию используется кодировка ascii
так как во втором примере все пишется в файл с заданной кодировкой, то и проблем не возникает
Для полноты ощущений можно глянуть http://python.su/forum/viewtopic.php?pid=48195#p48195
Офлайн
o7412369815963Что-то вы не внимательны это не второй питон, а третий
попробуй подставить ‘u’
Офлайн
dartNNNне в уникоде, а в utf8
# -*- coding: utf-8 -*-
Т.е. четко указать, что исходный текст идет в уникоде.
Офлайн
dartNNNа в 3-м как?o7412369815963Что-то вы не внимательны это не второй питон, а третий
попробуй подставить ‘u’
Офлайн
1) Что дает закоментированная строка # -*- coding: utf-8 -*- ?
2) Т.к. все равно не заработало забил на это, но опять столкнулся с той же проблемой.
print(“ax\N{SUPERSCRIPT TWO} + bx + c = 0”)
В Досовской консоли не работает.
Как я понимаю в Досе используется ASCII, а в Винде UTF-8 Юникод. Вот как из Юникода перегнать в ASCII?
Офлайн
Может в досовской консоли кодировка досовская? А питон выводит в 1251?
Офлайн
EvgenusОна говорит что программа использует utf-8. Просто формат записи такой вот, со знака комментария начинается.
1) Что дает закоментированная строка # -*- coding: utf-8 -*- ?
Отредактировано (Май 2, 2010 13:28:23)
Офлайн