Уведомления

Группа в Telegram: @pythonsu

#1 Сен. 15, 2013 11:58:29

med_phisiker
Зарегистрирован: 2012-04-08
Сообщения: 33
Репутация: +  0  -
Профиль   Отправить e-mail  

chr(i) возвращает таблицу cp1251

Здравствуйте, столкнулся с проблемой. Нужна работа с символами таблицы 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’ ?

Отредактировано med_phisiker (Сен. 15, 2013 11:59:17)

Офлайн

#2 Сен. 15, 2013 12:52:27

o7412369815963
От:
Зарегистрирован: 2009-06-17
Сообщения: 1986
Репутация: +  32  -
Профиль   Отправить e-mail  

chr(i) возвращает таблицу cp1251

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

Вам лучше использовать Utf-8, ну и выводить туда кто это понимает.

Офлайн

#3 Сен. 15, 2013 13:40:28

med_phisiker
Зарегистрирован: 2012-04-08
Сообщения: 33
Репутация: +  0  -
Профиль   Отправить e-mail  

chr(i) возвращает таблицу cp1251

спасибо за совет но у меня на pythone терминал написан для обмена с микроконтроллером по com порту, а микроконтроллер только ascii понимает а python почему то ему только cp1251 шлет ) вот и не знаю что делать )
И еще хотел спросить у вас такой вопрос ) т.е. если я буду использовать символы не относящиеся в командным (0 - 32) и только от 33 до 127 то тогда я буду пересылать символы которые одинаковы в cp1251 и ascii ?

Отредактировано med_phisiker (Сен. 15, 2013 14:01:50)

Офлайн

#4 Сен. 15, 2013 15:40:45

lorien
От:
Зарегистрирован: 2006-08-20
Сообщения: 755
Репутация: +  37  -
Профиль  

chr(i) возвращает таблицу cp1251

Нельзя слать данные в какой-то кодировке, можно только подразумевать на принимающей стороне, что поток байтов, которые были получены, следует трактовать как текст в какой-либо кодировке.

Офлайн

#5 Сен. 15, 2013 17:56:21

med_phisiker
Зарегистрирован: 2012-04-08
Сообщения: 33
Репутация: +  0  -
Профиль   Отправить e-mail  

chr(i) возвращает таблицу cp1251

Хорошо всем спасибо за ответы ) Если я правильно понял микроконтроллер работает с байтами и отвечает байтами, а трактует как символы их уже сам Python - терминал который трактует их по кодировке cp1251. Значит мне просто нужно декодировать приходящие байты в любую удобную мне кодировку )

Офлайн

#6 Сен. 15, 2013 21:26:31

doza_and
От:
Зарегистрирован: 2010-08-15
Сообщения: 4138
Репутация: +  252  -
Профиль   Отправить e-mail  

chr(i) возвращает таблицу cp1251

может вам как-то позаботиться чтобы самому отформатировать сообщения при выводе на консоль?

>>> ",".join([hex(i) for i in bytearray("\x03\n\t")])
'0x3,0xa,0x9'



Офлайн

#7 Сен. 16, 2013 15:14:44

med_phisiker
Зарегистрирован: 2012-04-08
Сообщения: 33
Репутация: +  0  -
Профиль   Отправить e-mail  

chr(i) возвращает таблицу cp1251

Всем спасибо за ответы - проблема решена ), я решил осуществить форматирование наперед заданными юникод-символами по совету 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)

Отредактировано med_phisiker (Сен. 16, 2013 15:55:40)

Офлайн

Board footer

Модераторировать

Powered by DjangoBB

Lo-Fi Version