Преобразование целого числа в 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-подобным" способом.