python: расширенные коды ASCII

Привет я хочу знать, как я могу добавлять, а затем печатать расширенные коды ASCII в python. У меня есть следующее.

code = chr(247)

li = []
li.append(code)
print li

результатом Python print out является ['xf7'], когда он должен быть символом деления. Если я просто печатаю код непосредственно "print code", то я получаю символ деления, но не если я добавляю его в список. Что я делаю не так?

спасибо.

4 ответов


когда вы печатаете список, он выводит представление по умолчанию всех его элементов-ie, вызывая repr() на каждом из них. The repr() строки-это ее экранированный код, по дизайну. Если вы хотите правильно вывести все элементы списка, вы должны преобразовать его в строку, например, через ', '.join(li).

обратите внимание, что, как указано в комментариях, на самом деле нет такой вещи, как "расширенный ASCII", есть только различные различные кодировки.


нет такой вещи, как "расширить ASCII - коды" - однако есть много символов, десятки тысяч, как определено в стандартах Unicode.

вы можете быть ограничены кодировкой кодировки вашего текстового терминала, которую вы можете думать как "Extend ASCII", но которая может быть "latin-1", например (если вы находитесь в системе Unix, такой как Linux или Mac OS X, ваш текстовый терминал, скорее всего, будет использовать кодировку utf-8 и сможет отображать любой из десятков тысяч символов доступен в Юникоде)

Итак, вы должны читать этот кусок, чтобы понять, что текст, после 1992 года - если вы пытаетесь сделать любое производственное приложение, веря в "расширенный ASCII", вы вредите себе, своим пользователям и всей эко-системе сразу:http://www.joelonsoftware.com/articles/Unicode.html

что сказал, Питон2 printвызовет неявное преобразование str для переданных объектов. Если вы используете список, это преобразование не рекурсивно str для каждого элемента списка вместо этого используется repr элемента, который отображает символы не ASCII в качестве их числового представления или других неподходящих обозначений.

вы можете просто присоединиться к желаемым символам в строке unicode, например, а затем распечатать их нормально, используя кодировку терминала:

import sys

mytext = u""
mytext += unichr(247) #check the codes for unicode chars here:  http://en.wikipedia.org/wiki/List_of_Unicode_characters

print mytext.encode(sys.stdout.encoding, errors="replace")

вам, вероятно, нужна кодировка charmap, которая позволяет превратить unicode в байты без "волшебных" преобразований.

s='\xf7'
b=s.encode('charmap')
with open('/dev/stdout','wb') as f:
    f.write(b)
    f.flush()

печати ÷ на моей системе.

обратите внимание, что "расширенный ASCII" относится к любому из ряда собственных расширений ASCII, ни один из которых никогда не был официально принят и все из которых несовместимы друг с другом. В результате символ, выводимый этим кодом, будет меняться в зависимости от выбора управляющим терминалом способа интерпретации он.


вы не делаете ничего плохого.

то, что вы делаете, это добавить строку длины 1 в список.

эта строка содержит символ вне диапазона печатаемых символов и вне ASCII (который составляет всего 7 бит). Вот почему его представление выглядит как '\xf7'.

Если вы напечатаете его, он будет преобразован так хорошо, как система может.

в Python 2 байт будет просто напечатан. Полученный результат может быть символом деления или любым другим другое дело, согласно кодировке вашей системы.

в Python 3 это символ Юникода и будет обрабатываться в соответствии с how stdout настройка. Обычно это действительно должно быть символом разделения.

в представлении списка,__repr__() вызывается строка, ведущая к тому, что вы видите.