Конвертация символов Юникода в целое число и число с плавающей точкой в Питоне

В предыдущей статье мы познакомились с Юникодом и способами обработки входных юникодных строк, разным способам обработки и преобразования их в читаемый вид – объекты типа стринг в Питоне.

Рассмотрим способы преобразования в другие типы выходных данных и применение различных кодировок к ним.

Формулировка задачи

Предположим, нам требуется отдать данные в виде символов представленных как целые числа int.

Функция ord.

Встроенная функция ord() в качестве аргумента принимает строковый символ Юникода и в ответ дает целое число типа int – значение кодовой точки Юникода.

A = 'u041f'
>>>print(ord(A))
# 1055

В случае, если аргумент состоит из двух и более символов, появится ошибка TypeError:

B = '\u041f\u0440\u0438\u0432\u0435\u0442'
>>>print(ord(B))
# TypeError: ord() expected a character, but string of length 6 found

Чтобы избежать этого применим генератор списка list в сочетании с функцией map, первым аргументом которой является функция int, а вторым – итерируемый составной объект – в нашем случае список:

>>>print(list(map(int, [ord(i) for i in B])))
# [1055, 1088, 1080, 1074, 1077, 1090]

Проверим тип данных:

>>>B_list = list(map(int, [ord(i) for i in B]))
>>>print(type(B_list{0]))
# <class 'int'>

Можно применить цикл for и сразу проверить тип данных каждого символа:

>>>for i in B:
   	print(ord(i), type(ord(i)), end=' ')
#1055 <class 'int'>
#1088 <class 'int'>
#1080 <class 'int'>
#1074 <class 'int'>
#1077 <class 'int'>
#1090 <class 'int'>

Конвертация символов Юникода в число с плавающей точкой

Аналогично задаче описанной выше, бывает необходимо преобразовать строку Юникода в числа типа float.

Функция ord.

Используя ord(), но уже обернув ее функцией float, мы получим нужный результат, при условии, что длина юникодной строки не превышает один символ:

A = '\u041f'
>>>print(int(ord(A)))
# 1055.0

Если же аргумент состоит из двух и более символов, будет вызвана ошибка TypeError, но мы уже знаем как её избежать – применим метод списка list:

>>>B = '\u041f\u0440\u0438\u0432\u0435\u0442'
>>>print(list(map(float, [ord(i) for i in B])))
# [1055.0, 1088.0, 1080.0, 1074.0, 1077.0, 1090.0]

Или применим цикл for, а тип данных каждого символа будет float, так как мы явно указали преобразовать в этот тип:

>>>for i in B:
   	print(float(ord(i)), sep=' ')
#1055.0 1088.0 1080.0 1074.0 1077.0 1090.0