Как узнать шестнадцатеричный код латинского символа в формате UTF-8?

Необходимо закодировать каждый символ из введённой строки в шестеричный номер кодировки UTF-8. Затем все полученные значения логически сложить. Когда я кодирую кириллицу, то получаю как мне и нужно число в шестнадцатеричном формате:

>> string = 'Г'
>> number = string.encode('utf-8')
>> b'\xd0\x93'

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

>> string = 'W'
>> number = string.encode('utf-8')
>> b'W'

Как можно получить шестнадцатеричное представление латинских символов и чисел?


Ответы (1 шт):

Автор решения: insolor

Для логического сложения вам не нужно шестнадцатеричное представление, нужны числовые представления байт. b'W' - это просто визуальное ("человекочитаемое") представление, эквивалентное b'\x57' (b'W' == b'\x57' даст True). Более того, b'W'[0] будет равно 87 и равно 0x57, т.е. просто обращаясь к отдельному байту из набора байт получаем числовое представление этого байта (что нам и нужно, см. первое предложение).

Для получения логической "суммы" всех байт, нужно просто пройти по последовательности байт, каждый байт "прибавлять" битовым "или" к результирующей переменной:

result = 0

for b in text.encode('utf-8'):
     result |= b  # То же самое что result = result | b

print(hex(result))

Если в функциональном стиле, то так:

from functools import reduce

result = reduce(lambda x, y: x | y, text.encode('utf-8'))
# Функция reduce объединяет последовательность из второго аргумента функцией из первого аргумента
# Для примера, если первым аргументом передать функцию, суммирующую два аргумента,
# то в результате получится сумма всех объектов последовательности

или

from functools import reduce
from operator import or_
# or_ - функция, соответствующая оператору |
# То есть or_(X, Y) == X | Y

result = reduce(or_, text.encode('utf-8'))
→ Ссылка