Основная кодировка в которой пишут программы на python

Unicode (Юникод) — это стандарт кодирования символов для большинства компьютеров. Он гарантирует, что текст — включая буквы, символы, эмодзи и даже управляющие символы — будет выглядеть одинаково на разных устройствах, платформах и в цифровых документах, независимо от операционной системы или программного обеспечения. Это важная составляющая интернета и компьютерной индустрии в целом. Без него всё было бы сложно и хаотично.

Unicode сам по себе не является кодировкой, а больше похож на базу данных почти всех возможных символов. В нём есть кодовая точка (идентификатор для каждого символа в базе данных), которая может иметь значение от 0 до 1,1 миллиона – как видите, скорее всего в ближайшее время эти уникальные кодовые точки не закончатся.

Каждая кодовая точка в Unicode обозначается U+n, где U+ — кодовая точка Unicode, а n — это набор для символа из четырех-шести шестнадцатеричных цифр. Unicode намного надежнее ASCII, в котором только 128 символов. Обмен цифровым текстом с помощью ASCII сложнее, так как он основан на американском английском и не поддерживает символы с диакритическими знаками. А в Unicode почти 150 000 символов и он охватывает символы всех языков мира.

Проблема с кодировкой Python

Поэтому от языков программирования и требуется правильно обрабатывать текст и обеспечивать интернационализацию программного обеспечения. Python используют для разных целей — от электронной почты до серверов и интернета — у него отличный способ обработки Unicode, он принимает стандарт Unicode для своих строк.

Иногда в работе с Unicode в Python могут возникать трудности и ошибки. В этом мануале представлены основы работы Unicode в Python, которые помогут вам избежать этих проблем. С помощью Python мы интерпретируем Unicode, применим к Unicode функцию нормализации и обработаем ошибки.

Требования

  • Python, установленный локально или на удаленном сервере. Если у вас еще не установлен Python, ознакомьтесь с этим мануалом.
  • Знание основ программирования и строковых методов Python. Читайте Основы работы со строками в Python 3.
  • Знание принципов работы с интерактивной консолью Python. Читайте мануал Использование интерактивной консоли Python.

1: Конвертирование кодовых точек Unicode в Python

Кодирование — это процесс представления данных в читаемой компьютером форме. Существуют разные способы кодирования данных — ASCII, Latin-1 и т. д. У каждой кодировки свои сильные и слабые стороны, но пожалуй, самой распространенной является UTF-8 — тип кодирования, который отображает символы со всего мира в одном наборе.

То есть, UTF-8 это незаменимый инструмент для всех, кто работает с интернационализированными данными. В целом, UTF-8 справляется с многими задачами. Он относительно эффективен и может работать в разных программах. UTF-8 конвертирует кодовую точку Unicode в понятные компьютеру шестнадцатеричные байты. Другими словами, Unicode – это маппинг, а UTF-8 позволяет компьютеру понять этот маппинг.

Прекрати писать код в ОДНОМ файле Python | ТОП 5 Ошибок и создание правильной архитектуры

В Python 3 кодировка строк по умолчанию – UTF-8, значит, любая кодовая точка Unicode в строке Python автоматически конвертируется в соответствующий символ.

>>> s = ‘u00A9’ >>> s

В этом коде мы создали строку s с кодовой точкой Unicode u00A9. Как упоминалось ранее, поскольку строка Python по умолчанию использует кодировку UTF-8, вывод значения s автоматически заменяет его на соответствующий символ Unicode. Обратите внимание, что u в начале кода обязателен. Без него Python не сможет конвертировать кодовую точку. В выводе получим соответствующий символ Unicode:

В Python есть встроенные функции для кодирования и декодирования строк. Функция encode() конвертирует строку в байтовую строку.

Для этого откройте интерактивную консоль Python и введите код:

>>> ».encode(‘utf-8’)

В результате получим байтовую строку символа:

b’xf0x9fx85xa5′

Обратите внимание, что перед каждым байтом стоит x, значит, это шестнадцатеричное число.

Примечание: Ввод спецсимволов Unicode в Windows и Mac отличается. В Windows предыдущий и все последующие примеры этого мануала, где используются символы, вы можете вставить с помощью утилиты Character Map. В Mac нет этой функции, поэтому лучше скопировать символ из примера кода.

Далее с помощью функции decode() конвертируем байтовую строку в обычную. Функция decode() принимает в качестве аргумента тип кодировки. Отметим, что функция decode() может декодировать только байтовую строку, которая задается с помощью буквы b в начале строки. Удаление b приведет к ошибке AttributeError.

В консоли введите:

>>> b’xf0x9fx85xa5′.decode(‘utf-8’)

Получим следующий вывод:

Теперь у вас есть базовое понимание интерпретации Unicode в Python. Далее мы разберем встроенный в Python модуль unicodedata, чтобы применить расширенные методы Unicode для строк.

2: Нормализация Unicode в Python

С помощью нормализации можно определить, одинаковы ли два символа, написанные разными шрифтами. Это удобно, когда два символа с разными кодовыми точками дают одинаковый результат. Например, мы воспринимаем символы Unicode R и ℜ как одинаковые, поскольку они оба представляют собой букву R, но для компьютера они разные.

Следующий пример кода это демонстрирует. Откройте консоль Python и введите следующее:

>>> styled_R = ‘ℜ’ >>> normal_R = ‘R’ >>> styled_R == normal_R

В результате получим:

False

Вывод будет False, потому что Python не считает эти два символа одинаковыми. Именно поэтому нормализация важна при работе с Unicode.

В Unicode некоторые символы создаются путем объединения нескольких символов в один. Нормализация также важна в этом случае, потому что она обеспечивает согласованность строк. Рассмотрим это на примере. Откройте консоль Python и введите код:

Читайте также:
Ваня написал программу для подсчета площади квадрата измени программу так чтобы она была

>>> s1 = ‘hôtel’ >>> s2 = ‘hou0302tel’ >>> len(s1), len(s2)

В этом коде мы создали строку s1, содержащую символ ô, а строка s2 содержит кодовую точку символа циркумфлекса ( ̂ ). Получим такой вывод:

Это значит, что две строки состоят из одинаковых символов, но имеют разную длину. Значит, они не подходят под условие равенства. Чтобы это проверить, введите в той же консоли:

>>> s1 == s2
False

Хотя строковые переменные s1 и s2 производят один и тот же символ Unicode, они различаются по длине и, следовательно, не равны.

Решить эту проблему можно с помощью функции normalize().

3: Нормализация Unicode с помощью NFD, NFC, NFKD и NFKC

Сейчас мы нормализуем строки Unicode с помощью функции normalize() из библиотеки unicodedata Python в модуле unicodedata (он обеспечивает поиск и нормализацию символов). Функция normalize() может принимать форму нормализации в качестве первого аргумента и нормализуемую строку в качестве второго аргумента. В Unicode существует четыре типа форм нормализации: NFD, NFC, NFKD и NFKC.

NFD разбивает символ на несколько комбинируемых символов. Это делает текст нечувствительным к диакритическим символам, что удобно при поиске и сортировке. Для этого нужно закодировать строку в байты.

Откройте консоль и введите следующее:

>>> from unicodedata import normalize >>> s1 = ‘hôtel’ >>> s2 = ‘hou0302tel’ >>> s1_nfd = normalize(‘NFD’, s1) >>> len(s1), len(s1_nfd)

Получим следующий вывод:

При нормализации строки s1 ее длина увеличилась на один символ. Это происходит по причине того, что символ ô разбивается на два символа — o и ˆ. Следующий код это подтвердит:

>>> s1.encode(), s1_nfd.encode()

В результате, после кодирования нормализованной строки символ o отделился от символа ˆ в строке s1_nfd:

(b’hxc3xb4tel’, b’hoxccx82tel’)

Форма нормализации NFC раскладывает символ, а затем перекомпонует его с любым доступным объединяющим символом. W3C рекомендует использовать NFC в интернете, поскольку NFC компонует строку для получения максимально короткого результата. Ввод с клавиатуры по умолчанию возвращает составленные строки, поэтому в этом случае рекомендуется применять NFC.

Для примера введите в интерактивную консоль:

>>> from unicodedata import normalize >>> s2_nfc = normalize(‘NFC’, s2) >>> len(s2), len(s2_nfc)

Вывод будет следующим:

При нормализации строки s2 её длина уменьшилась на единицу. Введите код в интерактивной консоли:

>>> s2.encode(), s2_nfc.encode()

Вывод будет таким:

(b’hoxccx82tel’, b’hxc3xb4tel’)

Символы o и ˆ соединены в один символ ô.

Формы нормализации NFKD и NFKC применяют для «строгой» нормализации и поиска, сопоставления образцов в строках Unicode. “K” в NFKD и NFKC означает совместимость.

NFD и NFC разделяют символы, но NFKD и NFKC выполняют разделение на совместимость для непохожих эквивалентых символов, при этом удаляются любые различия форматирования. Например, строка ②① не похожа на 21, но обе имеют одно значение. Формы нормализации NFKC и NFKD удаляют форматирование (в данном случае круг вокруг цифр) из символов, чтобы представить их упрощенную форму.

На примере разберем разницу между NFD и NFKD. Откройте интерактивную консоль Python и введите:

>>> s1 = ‘2⁵ô’ >>> from unicodedata import normalize >>> normalize(‘NFD’, s1), normalize(‘NFKD’, s1)

Получаем следующий вывод:

(‘2⁵ô’, ’25ô’)

Форма NFD не смогла разделить символ экспоненты в строке s1, но NFKD вырезала форматирование экспоненты и заменила символ совместимости (в данном случае экспоненту 5) на его эквивалент (5 в виде цифры). Так как NFD и NFKD разделяют символы, следовательно, ô увеличит длину на единицу. Это подтвердит следующее:

>>> len(normalize(‘NFD’, s1)), len(normalize(‘NFKD’, s1))

Принцип работы NFKC аналогичный, но он скорее не разделяет символы, а компонует их. В консоли Python введите:

>>> normalize(‘NFC’, s1), normalize(‘NFKC’, s1)

Вывод будет следующим:

(‘2⁵ô’, ’25ô’)

Строка для символа ô уменьшится на единицу, поскольку в NFKC композиционный подход (в случае разделения значение увеличивается на единицу). Проверим это с помощью кода:

>>> len(normalize(‘NFC’, s1)), len(normalize(‘NFKC’, s1))

Руководство разработчика Python по кодировке символов

Кодирование символов — распространенная проблема при разработке программного обеспечения. Как и в других языках программирования, кодирование символов в Python может быть проблематичным. В этой статье мы углубимся в кодировку символов, обсудим способы взаимодействия с текстом и байтами в вашем проекте Python 3 и исправим распространенные ошибки кодирования, используя кодировку символов в Python 3.

Кодировка символов

На человеческом языке текстовые файлы на компьютере содержат набор символов, составленных из текста или предложений, которые могут включать английский текст » a ” или латинский текст ” ā ”. Однако на компьютерном языке этот текстовый файл содержит биты и байты, а не текст. Подобно английскому или латыни, компьютер хранит символы в виде байтов. Эти байты больше похожи на компьютерные коды, которые переводятся в удобочитаемый текст. Этот перевод представляет собой кодировку символов.

Кодировка символов — это набор методов для преобразования необработанных двоичных файлов (0101110110) в читаемые символы (текст) с использованием таблицы поиска кодировки. Каждому символу присваивается уникальный идентификационный номер, который помогает компьютерам читать и понимать текст. Для интерпретации байтов используются несколько типов кодировок символов. Часто при интерпретации байтов применяется неправильная кодировка символов, из-за чего они отображаются в виде странных символов, таких как voil ├Ā ‡å-ã , или неизвестных символов, таких как ������; что еще хуже, это может вызвать ошибку, которая приведет к сбою вашей программы.

При работе с символами в Python вы столкнетесь с двумя основными типами данных: строками и байтами. Кодирование символов вращается вокруг кодирования и декодирования этих типов данных.

Строковый модуль

Строки — это компьютерные байты, интерпретируемые и отображаемые в удобочитаемой форме. До разработки Python 3 строки по умолчанию использовали двоичный формат для хранения байтов. Это подразумевает, что строки представляют собой байты с ASCII, заданной в качестве кодировки по умолчанию. Хотя ASCII был весьма полезен, он может кодировать только символы английского языка.

Читайте также:
Как составить спортивную программу

Решение этой проблемы привело к разработке универсального стандарта кодирования Unicode. Unicode — это универсальный набор символов, который определяет все символы для различных человеческих языков, используемых на компьютерах с более чем миллионом кодовых точек. Эти кодовые точки относятся к отображаемому тексту или символам.

В Python 3 каждая строка по умолчанию использует формат Unicode для представления символов. Это подразумевает, что каждый текст имеет определенную кодовую точку, которая отображает символы, использующие UTF-8 в качестве кодировки по умолчанию.

Байты

Второй тип данных — это байты, которые представляют собой последовательность целых чисел. Байт — это набор из восьми битов, которые представляют единицу информации. Символы в компьютере включают текст или строки, состоящие из одного или нескольких байтов. Представьте, что вы получаете файл, содержащий данные в байтах. Вам нужно будет перевести эти байты в читаемый текст.

В этом случае кодировка символов преобразует выбранный вами символ в правильные байты в памяти компьютера, прежде чем считывать байты обратно в символы для отображения текста.

Работа с кодировкой символов в Python

Как указывалось ранее, Python 3 имеет два типа данных: строки и байты. Процесс перемещения между строками и байтами известен как кодирование и декодирование в Python. Теперь давайте углубимся в то, как это работает.

Кодирование строк в байты

Процесс преобразования строк (текста) в компьютерные байты известен как кодирование. В Python 3 строки представляют собой удобочитаемый текст, представляющий собой символы Unicode. Unicode — это не кодировка, а абстрактный стандарт кодирования, который использует формат преобразования Unicode (UTF) для кодирования.

Хотя существует несколько кодировок символов, мы будем работать с UTF-8, который является кодировкой по умолчанию для Python 3. UTF относится к стандартной кодировке Python, а 8 относится к 8-битным единицам, используемым в кодировке символов. UTF-8 — это стандартная и эффективная кодировка строк Unicode, которая представляет символы в одно-, двух-, трех- или четырехбайтовых единицах. Python по умолчанию использует UTF-8, что означает, что его не нужно указывать в каждом файле Python.

Чтобы закодировать строку в байты, добавьте метод encode , который вернет двоичное представление строки.

>>> text = ‘Hello World’ >>> text.encode(‘utf-8′) b’Hello Word’

Выходные данные представляют собой двоичное представление Hello . Далее давайте посмотрим на что-то более сложное.

>>> text = ‘parlé’ >>> text.encode(‘utf-8′) b’parlxc3xa9’ >>> text = ‘résumé’ >>> text = text.encode(‘utf-8′) b’rxc3xa9sumxc3xa9’

В приведенном выше коде буквы « parl » являются символами ASCII, что позволяет их представлять. Каждый символ в таблице ASCII представляет собой один байт. Однако сложные символы, такие как é , несовместимы с ASCII в UTF-8 и представлены двумя закодированными байтами, xc3 и xa9 , как в первом примере.

Во втором примере строки, не совместимые с ASCII, представлены тремя закодированными байтами. UTF-8 может кодировать до четырех байтов. Это означает, что сложные символы в UTF-8 требуют несколько байтов для их двоичного представления.

Декодирование байтов в строки

Преобразование байтового объекта в строку известно как декодирование. Чтобы декодировать байты в строки, вызовите метод decode() и укажите тип кодировки символов, который вы хотите использовать. Конечно, мы используем UTF-8.

>>> text = b’parlxc3xa9′ >>> text.decode(‘utf-8’) ‘parlé’ >>> text = b’rxc3xa9sumxc3xa9′ >>> text.decode(‘utf-8) ‘résumé’

Когда мы передаем двоичный формат вместе с методом декодирования, на выходе получается наша исходная строка.

  • Помните, что вам не обязательно указывать UTF-8 при работе с Python 3. Мы указываем это здесь только для того, чтобы показать используемую кодировку.

Чтение текстового файла в Python

Файл на компьютере не содержит читаемого текста. Чтобы прочитать символы в файле как текст, вам необходимо использовать метод read() . Кроме того, в Python, когда вы открываете файл для чтения или записи, лучше всего указывать кодировку символов, с которой вы работаете. Это связано с тем, что при работе с текстовыми файлами Python по умолчанию использует разные кодировки символов в зависимости от операционной системы. Обычно, когда вы открываете файл с помощью метода open() , Python автоматически обрабатывает его как текстовый файл, чтобы преобразовать байты в текстовом файле в строку с нужной вам кодировкой. Лучше всего указать кодировку.

>>> with open(«data.txt», mode=»r», encoding=»utf-8″) as f: . message = f.read()

Написание текстового файла на Python

Вы также можете использовать метод open() для записи файлов. Для записи установите его на запись, введя mode = w :

>>> with open(«data.txt», mode=»w», encoding=»utf-8″) as f: . f.write(«Hi, I am having fun learning Python»)

Другие кодировки, доступные в Python

Как упоминалось ранее, для символов Unicode в Python доступно несколько кодировок. Мы уже обсуждали UTF-8, который является наиболее распространенным и широко используемым. Это также кодировка по умолчанию для Python 3, но есть и другие:

UTF-16: кодировка UTF-16 для символов Unicode представляет символы в два или четыре байта. Наименьшее двоичное представление символа в UTF-16 состоит из двух байтов. Основное преимущество UTF-8 перед UTF-16 заключается в том, что первая использует один байт для кодирования символа ASCII, а вторая кодирует тот же символ двумя или более байтами. Английский текстовый файл в кодировке UTF-16 как минимум в два раза больше, чем версия того же файла в кодировке UTF-8.

UTF-32: UTF-32 использует фиксированные четыре байта для кодирования символов Unicode. Это означает, что каждая кодировка символов использует четыре байта. UTF-16 использует больше памяти по сравнению с UTF-8 и UTF-16. Это быстрее и предпочтительнее для манипуляций со строками, потому что вы можете вычислить длину строки в байтах, используя количество символов в строке. Однако для каждого символа ASCII вы используете дополнительные три байта.

Читайте также:
Программа для настройки мыши bloody v8

Подводные камни и как их исправить

Избегайте ошибок кодирования символов любой ценой, так как они доставляют неудобства, и ни один разработчик не любит тратить время на исправление ошибки. Давайте рассмотрим распространенные ошибки при кодировании символов и способы исправления вероятных ошибок. Одной из распространенных ошибок, возникающих при работе с кодировкой символов в Python 3, является UnicodeEncodeError . Есть несколько причин этой ошибки.

Во-первых, ошибка UnicodeEncodeError может возникнуть при использовании символов, которые невозможно закодировать, например смайликов. Unicode поддерживает подавляющее большинство языков, но не все. Таким образом, символ, не поддерживаемый в Unicode, не будет работать. Во-вторых, когда strict метод используется по умолчанию для кодирования и декодирования, это вызовет ошибку, если символ не может быть закодирован или декодирован.

Существует также ошибка UnicodeDecodeError , которая возникает, когда кодировка символов байтов, которые мы читаем, и кодировка символов, которую Python пытается использовать для их чтения, не совпадают.

Как избежать или исправить эту ошибку?

Один из способов исправить ошибку кодировки символов — использовать метод ignore или replace для удаления специальных символов или эмодзи, которые не могут быть закодированы. Вы также можете использовать метод ignore при открытии файла, чтобы избежать каких-либо ошибок. Вот пример:

text = ‘ф’ with open(‘message.txt’, ‘w’, encoding=’utf-8′, errors=’ignore’) as f: f.write(text)

Заключение

Компьютеры не распознают текст; они хранят данные в двоичном формате. Кодировка символов — это ключ, который преобразует эти двоичные данные в читаемый текст. В этой статье мы обсудили несколько тем.

Ранний метод кодирования символов, ASCII, был недостаточен, поскольку он не позволял представлять неанглийские символы в двоичном формате. Это было решено введением Unicode, который присваивал определенную кодовую точку каждому удобочитаемому символу. Мы также обсудили, как работает кодирование в Python 3 и различные методы кодирования символов в Python.

Источник: dev-gang.ru

Кодирование строк

Чтобы компьютер смог отобразить передаваемые ему символы, они должны быть представлены в конкретной кодировке. Навряд ли найдется человек, который никогда не сталкивался с кракозябрами: открываешь интернет-страницу, а там – набор непонятных знаков; хочешь прочесть книгу в текстовом редакторе, а вместо слов получаешь сплошные знаки вопроса. Причина заключается в неверной процедуре декодирования текста (если сильно упростить, то программа пытается представить американцу, например, букву «Щ», осуществляя поиск в английском алфавите).

Возникают вопросы: что происходит, кто виноват? Ответ не будет коротким.

1. Компьютер – человек

Так сложилось, что компьютерная техника оперирует единицами и нулями. На вашей же клавиатуре представлено не менее 100 клавиш. Все, что вы вводите при печати, в итоге преобразуется в те самые бинарные величины.

В этом суть кодировки. ПК запоминает любые буквы, числа и знаки в виде определенного значения из единиц и нулей. Для примера: английская буква «Y» в двоичном коде выглядит как «0b1011001» , а в шестнадцатеричном как «0x59» .

Для осмысленного диалога пользователя и компьютера требуется двусторонний переводчик:
– «человеческие» строки необходимо перекодировать в байты;
– «компьютерную» речь требуется преобразовать в воспринимаемые пользователем осмысленные структуры.

В языке Python за это отвечают функции encode / decode . Важно кодировать и декодировать сообщение в одинаковой кодировке, чтобы не столкнуться с проблемой бессмысленных наборов символов.

2. ASCII

Так как первые вычислительные машины были малоемкими, для представления в их памяти всего набора требуемых знаков хватало 7 бит (или 128 символов). Сюда входил весь английский алфавит в верхнем и нижнем регистрах, цифры, знаки, вспомогательные символы.

Smartiqa Encoding

Пример ASCII символов

Поначалу этого вполне хватало. Кодировка получила имя ASCII (читается как «аски» или «эски»). В Пайтоне вы и сегодня можете посмотреть на символы ASCII. Для этого имеется встроенный модуль string .

Пример – IDE

С другими свойствами модуля можете ознакомиться самостоятельно.

Время шло, компьютеризация общества ширилась, 128 символов стало не хватать. Оставшийся последний 8-ой бит также выделили для кодирования (а это еще 128 знаков). В итоге появилось большое количество кодировок (кириллическая, немецкая и т.п.). Такая ситуация привела к проблемам. Уже в то время англичанин, получающий электронное письмо из России, мог увидеть не русские буквы, а набор непонятных закорючек.

Потребовалось указание кодировок в заголовках документов.

3. Юникод-стандарт

Как вы считаете, сколько нужно символов, чтобы хватило всем и навсегда? 10_000? Конечно, нет. Уже сегодня более 100_000 знаков имеет свое числовое представление. И это не предел.

Люди постоянно придумывают новые «буквы».

Откройте свой телефон и создайте пустое сообщение. Зайдите в раздел «смайликов». Да их тут больше сотни! И это не картинки в большинстве своем. Они являются символами определенной кодировки.

Если вы застали времена, когда SMS-технологии только начинали развиваться, то этих самых «смайлов» было не более десятка. Лет через 10 их количество станет «неприличным».

Упомянутая выше кодировка ASCII в своем расширенном варианте породила большое количество новых. Основная беда: имея 128 вариантов обозначить символ, мы никак не сумеем внедрить туда буквы других языков. В частности, какой-нибудь символ под номером 201 в кириллице даст совсем не русскую букву, если отослать его в Румынию. Следовательно, говоря кому-то «посмотри на 201-ый символ» мы не даем никакой гарантии, что собеседник увидит то же.

Для решения задачи был разработан стандарт Unicode. Отметим, что это не определенная кодировка, а именно набор правил. Суть юникода – связь символа и определенного числа без возможного повторения. Если мы кого-то попросим показать символ, скрытый под номером «1000», то в любой точке планеты он будет одним и тем же графическим элементом.

Источник: smartiqa.ru

Рейтинг
( Пока оценок нет )
Загрузка ...
EFT-Soft.ru