Автор оригинала: Evgeny Erunov.
Этот учебник покажет вам, как преобразовать строку Unicode в строку в Python. Если вы уже знаете о Unicode, вы можете пропустить следующую предпосылку и погрузиться в эту проблему сразу.
Фон Unicode
Немного о Unicode Из Википедии.
Unicode это Кодировка персонажа Стандарт, который включает в себя персонажи почти все написано Языки В мире. Стандарт теперь распространен на Интернет Отказ
Стандарт был предложен в 1991 году некоммерческой организацией «Unicode Consortium» (Unicode Inc). Использование этого стандарта позволяет кодировать очень большое количество символов из разных систем написания: в документах, закодированных в соответствии со стандартом Unicode, китайский Иероглиф , математические символы, буквы Греческий алфавит , Латынь и Кириллический алфавит Символы музыкальной обозначения становятся ненужными, а переключение Кодовые страницы становится ненужным.
В Unicode существует несколько форм представления (формат трансформации Unicode, UTF): UTF-8, UTF-16 (UTF-16BE, UTF-16LEL) и UTF-32 (UTF-32BE, UTF-32LE). В потоке данных NOTF-16 низкий байт может быть записан либо до высокого порядка (utf-16 Little-Endian, UTF-16Le) или после высокого порядка (UTF-16 Big-Endian, UTF-16BE). Аналогичным образом, есть два варианта четырехбайтовой формы презентации – UTF-32LE и UTF-32BE. Все они также называются кодировками.
Microsoft Windows NT и системы, основанные на нем в основном использовать Форма UTF-16LE. Unix -подобные Операционные системы GNU/Linux , BSD и Mac OS X Примите UTF-8 для файлов и UTF-32 или UTF-8 для в память обработка персонажей.
Часто мы получаем в качестве входной строки символов Unicode, которая нечитается обычным пользователем, но имеет много преимуществ в течение регулярного текста, например, он занимает меньшее количество места памяти или занимает меньше времени для обработки и дополнительной передачи. В зависимости от дополнительных требований к строке Unicode или в зависимости от окружающей среды (будь то операционная система или программное обеспечение), необходимо определить кодировку, которая может и должна использоваться.
UTF-8 теперь является доминирующим кодированием в Интернете. UTF-8, по сравнению с UTF-16 , дает наибольшую выгоду в компактности для текстов на латыни, поскольку латинские буквы, цифры и наиболее распространенные знаки пунктуации кодируются в UTF-8 только одним байтом, а коды этих символов соответствуют их кодам в Ascii Отказ
UTF-16 – кодирование, которое позволяет написать символы Unicode в диапазонах U + 0000 … U + D7FF и U + E000 … U + 10FFFF (общей словом 1112064). Более того, каждый символ написан в одном или двух словах (суррогатная пара).
UTF-32 это способ представления Unicode, в котором каждый символ имеет ровно 4 байта. Основным преимуществом кодировщиков UTF-32 по сравнению с переменной длиной является то, что символы Unicode в нем непосредственно индексируются, поэтому нахождение символа по номеру положения в файле может быть чрезвычайно быстрым, и получают любой символ в N-Th Position операция, которая всегда занимает одно и то же время. Это также позволяет очень легко заменить символы в строки UTF-32. Напротив, кодировки переменной длины требуют последовательного доступа к N-го символу, который может быть очень трудоемким. Основным недостатком UTF-32 является его неэффективное использование пространства, так как четыре байта используются для хранения любого символа.
Постановка проблемы
Предположим, у нас есть строка Unicode, и нам нужно преобразовать его в строку Python.
A = '\u0048\u0065\u006C\u006C\u006F'
Давайте убедимся в входном типе данных:
>>> type(A)
Метод 1. Строка
В Python 3 все текст – строки Юникода по умолчанию, что также означает, что U '
Синтаксис больше не используется.
Большинство переводчиков Python поддерживают Unicode и когда вызывается функция печати, интерпретатор преобразует последовательность входных данных от символов Escape Unicode в строку.
print(str(A)) # Hello
Нет смысла проверять тип данных после применения строка метод.
Способ 2. Repra ()
Встроенный rep ()
Функция возвращает строку, содержащую печатное формальное представление объекта.
print(repr(A)) # 'Hello'
Проверьте тип данных:
print(type(repr(A))) #
Способ 3. Модуль Unicodedata, функция нормализуется
нормализовать ()
Функция Unicodedata Модуль возвращает нормальную форму для строки Unicode. Допустимые значения для формы NFC, NFKC, NFD и NFKD.
Стандарт Unicode определяет различные формы нормализации строки Unicode на основе определения канонической эквивалентности и эквивалентности совместимости. В Unicode несколько символов могут быть выражены по-разному. Например, персонаж U + 00C7 (латинская заглавная буква C с Cedilla) также может быть выражена как последовательность U + 0043 (латинская буква Collection C) U + 0327 (объединяя Cedilla).
Существует две нормальные формы для каждого персонажа: нормальная форма C и нормальная форма D. Нормальная форма d (NFD) также известна как каноническое разложение и переводит каждый характер в разлагаемую форму. Нормальная форма C (NFC) сначала применяет каноническое разложение, затем повторно создает предварительно комбинированные символы.
В дополнение к этим двум формам существует две дополнительные нормальные формы, основанные на эквивалентности совместимости. Некоторые символы поддерживаются в Unicode, обычно сочетаются с другими персонажами. Например, U + 2160 (римский цифр) действительно такой же, как U + 0049 (Латинская столица I). Однако он поддерживается в Unicode для совместимости с существующими наборами символов, таких как GB2312.
Нормальная форма KD (NFKD) применит разложение совместимости, то есть заменить все символы совместимости с их эквиваленты. Нормальная форма Kc (NFKC) применяет разложение совместимости первым и затем каноническим составом.
Несмотря на то, что два струны Unicode нормализуются и выглядят одинаково для людей, если кто-то сочетается с персонажами, а другой нет, они не могут совпадать.
import unicodedata print(unicodedata.normalize('NFC', A)) # Hello
Давайте проверим тип данных после нормализации:
print(type(unicodedata.normalize('NFC', A))) #
Способ 4. Список понимания и str.join
str.join () Способ возвращает строку, которая является конкатенацией (объединение) всех элементов строк итеративных.
В финальной строке элементы объединены друг с другом с использованием строки сепаратора напряжения.
Если есть какие-либо строковые значения в последовательности, включая Байты Затем поднял Исключение типа «Типерре» Отказ
Давайте проверим, как это работает:
print(''.join([str(i) for i in A])) # Hello
''
– Пустая строка включает в себя элементы списка, который мы составили от элементов строки A, используя метод соединения.
Поскольку мы указывали на обернув каждую передачу списка с функцией CL, мы можем смело предположить, что результат будет желаемым типом данных:
print(type(''.join([str(i) for i in A]))) #
Метод 5. Библиотека FTFY
Полное имя этой библиотеки – Исправляет текст для вас Отказ Он предназначен для превращения вредных строк Unicode («quotes € \ x9d или uì) в хорошие строки Unicode (« цитаты »или ü соответственно).
Посмотрим, как это работает в нашем примере:
import ftfy print(ftfy.fix_text(A)) # Hello
Что это делает с типом вывода данных:
print(type(ftfy.fix_text(A))) #
Отлично, это то, что вам нужно, главное, что библиотека остается доступной;)
Метод 6. Модуль IO
Модуль IO Применимо, когда вам необходимо выполнить операцию ввода/вывода в файлах (например, чтение или запись файлов). Вы можете использовать встроенный Читать ()
и Написать ()
Методы для чтения или записи файла, но этот модуль дает нам гораздо больше вариантов кода для этих операций, таких как запись или чтение из буфера.
В нашем простом примере это было бы выглядеть так:
print(io.StringIO(A).read()) # Hello
IO.stringio
Работает с данными типа строка, как в входе и выходе. Всякий раз, когда входная строка или поток данных состоит из символов байтов или Unicode, кодирование или декодирование данных выполняются прозрачно, и учитывается дополнительный перевод средств, специфичных к средам.
Способ 7. Формат
Этот метод, по-видимому, является наиболее мощным и эффективным, поскольку он позволяет работать со всеми типами данных: байты, строки, INT и поплавковые номера в разных представлениях (восьмерикальные, десятичные, шестнадцатеричные в разных регистрах) с использованием Спецификация мини-языка , что позволяет указывать не только тип данных, но и смещение, округление, заполнение символами к требуемой длине, а также позволяет работать с словарями и их индексами в различных вариациях.
Давайте проверим с нашим примером:
print(format(A, 's')) # Hello
Здесь – это тип отформатированного объекта – строка, используемая по умолчанию. Подробнее о спецификации и синтаксисе здесь Отказ