Как узнать шестнадцатеричный код латинского символа в формате UTF-8?
Необходимо закодировать каждый символ из введённой строки в шестеричный номер кодировки UTF-8. Затем все полученные значения логически сложить. Когда я кодирую кириллицу, то получаю как мне и нужно число в шестнадцатеричном формате:
>> string = 'Г'
>> number = string.encode('utf-8')
>> b'\xd0\x93'
Но когда я кодирую английский символ или число, то в результате получаю его же.
>> string = 'W'
>> number = string.encode('utf-8')
>> b'W'
Как можно получить шестнадцатеричное представление латинских символов и чисел?
Ответы (1 шт):
Для логического сложения вам не нужно шестнадцатеричное представление, нужны числовые представления байт. 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'))