Рубрики
Без рубрики

Как преобразовать строку Unicode в строковый объект в Python?

Этот учебник покажет вам, как преобразовать строку Unicode в строку в Python. Если вы уже знаете о Unicode, вы можете пропустить следующую предпосылку и погрузиться в эту проблему сразу. Фон Unicode немного о Unicode от Wikipedia. Unicode – это стандарт кодирования персонажа, который включает в себя символы почти … Как преобразовать строку Unicode в строковый объект в Python? Прочитайте больше “

Автор оригинала: 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

Здесь – это тип отформатированного объекта – строка, используемая по умолчанию. Подробнее о спецификации и синтаксисе здесь Отказ