Преобразование целого числа в 8-битные символы ASCII, НЕ в Юникоде в Python 3 - PullRequest
0 голосов
/ 03 марта 2020

Я работал над проектом, в котором я кодирую числа как символы. Привыкнув к C ++, я предположил, что могу просто использовать любое 8-битное число и привести его к символу. Однако функция python chr () возвращает символы Unicode, которые не являются 8-битными, поэтому работать не будут.

Я новичок в Python, и из того, что я прочитал, в предыдущих версиях были две отдельные функции: chr() для символов ASCII и unichr() для символов Юникода.

Я также ограничен тем, что могу получить в стандартной python библиотеке для windows (нам не разрешено устанавливать модули с pip).

Обычно это может быть хорошо, но вот пример когда это может испортить мою программу: если я кодирую целое число 143:

# this is not taken from my actual code
num = 143    
c = chr(143)
print(c)

, я ожидаю, что это напечатает символ ASCII (заглавная буква A с маленьким кружком над ним). Вместо этого я получаю Unicode \x8f, который представляет «SS3» (Single Shift 3).

TL; DR: я конвертирую 8-битные числа в символы, но chr () конвертирует в Unicode, и мне REALLY нужен способ конвертации в ASCII, но Кажется, я не могу найти его в стандартной библиотеке.

Я знаю, что это такая простая проблема, и очень неприятно застревать на этом всех вещей.

Заранее большое спасибо!
Хорошего дня!
- Влад

1 Ответ

3 голосов
/ 03 марта 2020

«A с маленьким кружком над ним» не является символом ASCII, и 143 находится вне диапазона ASCII (0-127).

Похоже, вы думаете с точки зрения закодированных байтов, а не кодовых точек Юникода (которые Python3 использует для представления строковых значений). См. здесь для 8-битных кодировок, где b'\x8f' представляет 'Å'.

Вы, вероятно, хотите сделать что-то вроде этого:

import sys
c = 143
# Convert to byte
b = c.to_bytes(1, sys.byteorder)
# Decode to unicode (str) and print
print(b.decode('cp437'))
Å‎

Вы также можете взять взгляните на пакет struct в стандартной библиотеке, который работает с байтами и символами более "C -подобным" образом.

...