Найти - Пользователи
Полная версия: В чем проблема с выводом unicode
Начало » Python для новичков » В чем проблема с выводом unicode
1
Evgenus
Изучаю 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)
Там ошибок никаких нет.

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

Может быть вот эта тема вам поможет?
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