Преобразование целого числа в 8-битные символы ASCII, а НЕ Unicode в Python 3

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

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

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

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

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

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

TL;DR: я конвертирую 8-битные числа в символы, но chr() преобразуется в Unicode, и мне ДЕЙСТВИТЕЛЬНО нужен способ преобразования в ASCII, но я не могу найти его в стандартной библиотеке.

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

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

1 ответ

Решение

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

Похоже, вы думаете о закодированных байтах, а не о кодовых точках Unicode (которые 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-подобным" способом.

Другие вопросы по тегам