Найти - Пользователи
Полная версия: chr(i) возвращает таблицу cp1251
Начало » Python для экспертов » chr(i) возвращает таблицу cp1251
1
med_phisiker
Здравствуйте, столкнулся с проблемой. Нужна работа с символами таблицы ascii. Использую Python 2.7.5 судя по документации есть функция которая возвращает символы таблицы ascii chr.
chr(i)¶
Return a string of one character whose ASCII code is the integer i. For example, chr(97) returns the string ‘a’. This is the inverse of ord(). The argument must be in the range , inclusive; ValueError will be raised if i is outside that range. See also unichr().

Однако код
for i in xrange(256):
      print i, '\t', chr(i)

дает таблицу символов кодировки cp1251! Подскажите как рисовать ascii символы ? например черное сердце ‘\x03’ ?
o7412369815963
med_phisiker
дает таблицу символов кодировки cp1251!
Нет, тут питон выдает байты 0..255, это ваша консоль уже воспринимает их как cp1251.
По идее ascii - это первые 128 символов, далее идут национальные символы.
‘\x03’ - относится к управляющим символам, а не к выводимым, хотя где-то может быть переопределен.

Вам лучше использовать Utf-8, ну и выводить туда кто это понимает.
med_phisiker
спасибо за совет но у меня на pythone терминал написан для обмена с микроконтроллером по com порту, а микроконтроллер только ascii понимает а python почему то ему только cp1251 шлет ) вот и не знаю что делать )
И еще хотел спросить у вас такой вопрос ) т.е. если я буду использовать символы не относящиеся в командным (0 - 32) и только от 33 до 127 то тогда я буду пересылать символы которые одинаковы в cp1251 и ascii ?
lorien
Нельзя слать данные в какой-то кодировке, можно только подразумевать на принимающей стороне, что поток байтов, которые были получены, следует трактовать как текст в какой-либо кодировке.
med_phisiker
Хорошо всем спасибо за ответы ) Если я правильно понял микроконтроллер работает с байтами и отвечает байтами, а трактует как символы их уже сам Python - терминал который трактует их по кодировке cp1251. Значит мне просто нужно декодировать приходящие байты в любую удобную мне кодировку )
doza_and
может вам как-то позаботиться чтобы самому отформатировать сообщения при выводе на консоль?
>>> ",".join([hex(i) for i in bytearray("\x03\n\t")])
'0x3,0xa,0x9'
med_phisiker
Всем спасибо за ответы - проблема решена ), я решил осуществить форматирование наперед заданными юникод-символами по совету doza_and. Юникод код ascii символа можно получить следующим образом, в блокноте windows нажать alt + <десятичный номер символа на дополнительной клавиатуре>, в блокноте появиться ascii символ, дальше его можно вставить в конвертер который пишет юникод код символа. Я использовал конвертер с http://ascii.org.ru/ может кому пригодиться ) Далее составил свой формат по совету doza_and, составлять пришлось только для служебных символов 0-32, которые отображаются не так как в таблице ascii, а остальные и так прекрасно работают. Как я понял 0-32 это служебные символы не предназначенные для отображения пользователю, поэтому в разных редакторах они могут выглядеть по разному. Все работает, теперь Python печатает и “служебные символы из ascii таблицы” 0-32 в символах указанных в таблице(как в блокноте windows), еще раз всем спасибо )

например теперь при получении байта hex “\x03” или dec 3 Python терминал выведет символ
print unichr(9829)
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