qman
bialix
тогда почему в цикле while и после окончания цикла одному и тому номеру соответствуют разные символы?
Такое утверждение я сделал из за того что переменную “c” приходится делать decode('cp866') а символ отображается без соответствующий номеру “a” .
нифига не понял.
функция chr превращает байт в строку единичной длины, символ которой полностью соответствует этому байту.
Поэтому chr(0x80) == “\x80”
Далее.
Вы могли бы увидеть реальные коды в строке c делая
print repr©
Тогда бы вы получили нечто такое:
>>> c = “”.join()
>>> print repr©
' !"#$%&\'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ^_`abcdefghijklmnopqrstuvwxyz{|}~\x7f\x80\x81\x82\x83\x84\x85\x
86\x87\x88\x89\x8a\x8b\x8c\x8d\x8e\x8f\x90\x91\x92\x93\x94\x95\x96\x97\x98\x99\x9a\x9b\x9c\x9d\x9e\x9f\xa0\xa1\xa2\xa3\xa4\xa5\x
a6\xa7\xa8\xa9\xaa\xab\xac\xad\xae\xaf\xb0\xb1\xb2\xb3\xb4\xb5\xb6\xb7\xb8\xb9\xba\xbb\xbc\xbd\xbe\xbf\xc0\xc1\xc2\xc3\xc4\xc5\x
c6\xc7\xc8\xc9\xca\xcb\xcc\xcd\xce\xcf\xd0\xd1\xd2\xd3\xd4\xd5\xd6\xd7\xd8\xd9\xda\xdb\xdc\xdd\xde\xdf\xe0\xe1\xe2\xe3\xe4\xe5\x
e6\xe7\xe8\xe9\xea\xeb\xec\xed\xee\xef\xf0\xf1\xf2\xf3\xf4\xf5\xf6\xf7\xf8\xf9\xfa\xfb\xfc\xfd\xfe\xff'
Теперь вернемся к вашему исходному коду.
1) Я не понимаю, что вы хотите сделать
2) Если работать в консоли, то мое решение нормально печатает все символы строки в виде тех символов, которым соответствуют коды символов в кодировке CP866. Вот:
>>> print c
!"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ^_`abcdefghijklmnopqrstuvwxyz{|}~⌂АБВГДЕЖЗИЙКЛМНОПРСТУФХЦЧШЩЪЫЬЭЮЯ
абвгдежзийклмноп░▒▓│┤╡╢╖╕╣║╗╝╜╛┐└┴┬├─┼╞╟╚╔╩╦╠═╬╧╨╤╥╙╘╒╓╫╪┘┌█▄▌▐▀рстуфхцчшщъыьэюяЁёЄєЇїЎў°∙·√№¤■
3) Ваш исходный код c = c+“%s”%(chr(a)) падает, когда начальное значение с равно юникодной строке, вот здесь вы делаете пустую юникодную строку: “”.decode('cp1251'). Кстати, так можно было не извращаться, достаточно было написать c = u“”
4) Почему падает ваш начальный код при попытке конвертировать символ символ с кодом 128 в юникод?
В traceback причина написана: ‘ascii’ codec can't decode byte 0x80 in position 0: ordinal not in range(128)
Перевожу на русский: ‘ascii’ кодек не может декодировать байт 0x80 в позиции 0: значение не в диапазоне range(128)
На всякий случай напомню, что кодировка ASCII определяет только символы с кодами от 1 до 127 включительно.
5) На всякий случай – range() – это функция порождающая список целых чисел:
>>> range(128)
[0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 3
4, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, 64, 65, 6
6, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, 80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, 91, 92, 93, 94, 95, 96, 97, 9
8, 99, 100, 101, 102, 103, 104, 105, 106, 107, 108, 109, 110, 111, 112, 113, 114, 115, 116, 117, 118, 119, 120, 121, 122, 123, 1
24, 125, 126, 127]
Таким образом сообщение об ошибке говорит вам, что ascii-кодек может преобразовать только символы, чьи коды лежат внутри списка range(128)
6) При печати обычной (не-юникодной строки) на экран она выводится как есть, а на экране отображается самой консолью, с использованием тех шрифтов и той кодировки, которая присуща самой консоли. К питону это не имеет никакого отношения.
7) Чтобы узнать кодировку консоли можно воспользоваться таким кодом:
>>> import sys
>>> sys.stdout.encoding
'cp866'
Если я переключу кодировку консоли при помощи команды виндовс-консоли chcp 1251, а потом запущу питон и снова спрошу кодировку консоли, то в ответ увижу ‘cp1251’. Все честно.
8) Когда вам нужно напечатать некоторую
юникодную строку на экране, то можно понадеяться на опреатор print либо перекодировать ее в не-юникод самостоятельно.
9) Когда вы передаете оператору print юникод-строку, которую надо напечатать, то питон сначала пытается перекодировать ее в обычную строку, используя кодек, соответствующий кодировке консоли (см. п.7). Если это невозможно, потому что ваша юникод-строка содержит символы, которые невозможно отобразить в данной кодировке консоли, вы получаете UnicodeEncodeError.
10) Когда вы конвертируете строку из юникода в обычный вид перед тем как напечатать, то используете метод encode юникодной строки:
s = u.encode('cp866')
При этом опять же можно поймать UnicodeEncodeError, если кодировка была выбрана неправильно. Но можно подавить эту ошибку, предложив кодеку заменять “неверные” символы вопросиками:
s = u.encode('cp1251', replace)
Обо всем этом можно попробовать почитать в справке к питону, см. раздел по модулю codecs.