В предыдущей статье мы познакомились с Юникодом и способами обработки входных юникодных строк, разным способам обработки и преобразования их в читаемый вид – объекты типа стринг в Питоне.
Рассмотрим способы преобразования в другие типы выходных данных и применение различных кодировок к ним.
Формулировка задачи
Предположим, нам требуется отдать данные в виде символов представленных как целые числа 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