<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:content="http://purl.org/rss/1.0/modules/content/" xmlns:wfw="http://wellformedweb.org/CommentAPI/" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:sy="http://purl.org/rss/1.0/modules/syndication/" xmlns:slash="http://purl.org/rss/1.0/modules/slash/">
  <channel>
    <language>ru</language>
    <title>Работа с кодировками</title>
    <description>Интересные материалы и различные руководства по работе с кодировками</description>
    <link>https://tproger.ru/tag/encodings</link>
    <atom:link href="https://tproger.ru/tag/encodings/feed" rel="self" type="application/rss+xml"/>
    <lastBuildDate>Wed, 23 Sep 2026 22:49:26 GMT</lastBuildDate>
    <sy:updatePeriod>hourly</sy:updatePeriod>
    <sy:updateFrequency>12</sy:updateFrequency>
    <image>
      <title>Работа с кодировками</title>
      <link>https://tproger.ru</link>
      <url>https://tproger.ru/apple-touch-icon.png</url>
    </image>
    <item>
      <title>Чек-лист вопросов потенциальному работодателю</title>
      <link>https://tproger.ru/articles/chek-list-voprosov-potencialnomu-rabotodatelyu</link>
      <comments>https://tproger.ru/articles/chek-list-voprosov-potencialnomu-rabotodatelyu?scrollTo=tproger-comments</comments>
      <dc:creator><![CDATA[Semyon Yushkevich]]></dc:creator>
      <guid isPermaLink="true">https://tproger.ru/articles/chek-list-voprosov-potencialnomu-rabotodatelyu</guid>
      <description><![CDATA[<p>Составили чек-лист вопросов для работодателей, который позволит выяснить нюансы, касающиеся зарплаты, условий трудоустройства, и так далее.</p><p>— Читать дальше «<a rel="follow" href="https://tproger.ru/articles/chek-list-voprosov-potencialnomu-rabotodatelyu">Чек-лист вопросов потенциальному работодателю</a>»</p>]]></description>
      <category><![CDATA[Карьера]]></category>
      <category><![CDATA[Собеседование]]></category>
      <category><![CDATA[Работа с кодировками]]></category>
      <category><![CDATA[Статьи]]></category>
      <slash:comments>0</slash:comments>
      <pubDate>Mon, 11 Dec 2023 11:08:14 GMT</pubDate>
      <content:encoded><![CDATA[<p>Поиск работы в IT может быть весьма непростым и волнительным занятием. В процессе прохождения собеседований соискатель сталкивается с необходимостью корректно оценить своего потенциального работодателя, и важность грамотной оценки сложно переоценить, поскольку ошибочный выбор может свести на нет целые годы жизни и карьеры.</p><p>К счастью, прохождение интервью и успешное трудоустройство значительно упрощаются, если под рукой имеется четкий перечень вопросов, который поможет вам:</p><ul><li>выявить позитивные и негативные аспекты предстоящей вам работы;</li><li>сформировать первое впечатление о коллективе и непосредственном руководстве;</li><li>убедиться, что вакансия соответствует вашим личным и профессиональным ожиданиям;</li><li>сделать взвешенный, обоснованный выбор касаемо выбранной вами позиции.</li></ul><p>В данной статье представлен чек-лист вопросов, который позволит вам поэтапно выяснить нюансы, касающиеся зарплаты, условий трудоустройства, организационной культуры, возможностей для карьерного роста, технического стека и так далее.</p><p>Благодаря данному чек-листу вам станет легче вести конструктивный и содержательный диалог с рекрутерами и своими будущими коллегами. Вы сможете проявить себя с лучшей стороны, показав свою заинтересованность, системный и методичный подход к поиску работы. В конце концов, вы сможете серьезно увеличить шансы на то, что попадете в то место, которым вы будете по-настоящему удовлетворены.</p><p>Вы можете скопировать нижеперечисленные блоки с вопросами и пользоваться ими как шпаргалкой прямо на интервью. Каждый блок характеризует определенную категорию вопросов, с пометкой о том, на каком этапе(-ах) эти вопросы будут уместны.</p><h2>Общие вопросы</h2><p><b>Этап: вводный разговор с рекрутером.</b></p><ol><li>Какая у вас вилка ЗП? Хотя бы приблизительно.</li><li>По какой форме трудоустройства мы будем сотрудничать? ИП, ТК, ГПХ?</li><li>Есть ли ожидания по релокации? Возможна ли работа на удаленке?<br /><i>Важный нюанс: если речь идет о зарубежном работодателе, и при этом вы находитесь в России, то следует также поинтересоваться, возможна ли работа из РФ. Ответ на этот вопрос может сразу предопределить исход всего интервью.</i></li><li>Что вы оценили в моем резюме? Есть ли моменты, которые не очень понравились?</li><li>Есть ли у вас соглашение о неразглашении?</li><li>Какой у вас рабочий график и можно ли его двигать?</li><li>Как у вас обстоят дела с отпусками?</li><li><i>У вас имеется возможность обучения за счет компании?</i></li><li><i>Какие ожидания от успешного кандидата через полгода? Год? Два?</i></li><li>Можно ли будет выложить в портфолио работы, которые я сделаю по ходу нашего сотрудничества, или такая возможность отсутствует?</li><li>Что я смогу написать через 2-4 года в резюме?</li><li>Как у вас обстоят процессы в команде?</li><li>Какого рода задачи меня ожидают на новой позиции?</li><li>Есть ли перспективы продолжить сотрудничество после проекта?<br /><i>Данный вопрос имеет смысл в том случае, если в текущий момент вы договариваетесь лишь о временном сотрудничестве.</i></li></ol><h2>По зарплате</h2><p><b>Этап: вводный разговор с рекрутером.</b></p><ol><li>Каков период испытательного срока? Какая зарплата устанавливается на этот период? Возможен ли ее пересмотр по результатам испытательного срока?</li><li>У вас почасовая или фиксированная ставка?</li><li>Вы проводите индексацию и пересмотр зарплаты? Если да, то когда и как часто?</li></ol><h2>По вакансии</h2><p><b>Этап: вводный разговор с рекрутером, знакомство с командой.</b></p><ol><li>Эта вакансия вновь открывшаяся или нет? Если вакансия открылась в связи с увольнением, то почему бывший сотрудник уволился?</li><li>Для чего открыта вакансия? Какую проблему она решает?</li></ol><h2>Про больное</h2><ol><li>У вас есть строгие дедлайны? Когда нужно срочно сделать какую-то задачу за n дней?</li><li>Как часто у вас случаются “пожары” (срочные задачи с наивысшим приоритетом)?</li><li>У вас случаются переработки? Если да, то насколько часто и как они оплачиваются?</li><li>Если я приболел на пару дней, это спокойно воспринимается?</li><li>Как сотрудники отчитываются перед руководством? Например отчеты, тайм-трекеры.</li></ol><h2>Организационные вопросы</h2><p><b>Этап: знакомство с командой.</b></p><ol><li>Не могли бы рассказать подробнее о структуре вашей организации?</li><li>Проводятся ли в вашей команде ретроспективы? Не могли бы вы назвать две основные проблемы, которые поднимались прошлый раз? Какие действия были предприняты для решения проблем? Не могли бы вы рассказать о том, как у вас проходят Agile мероприятия (стендапы, синки и так далее)?</li><li>Как ставятся, контролируются, проектируются, разрабатываются, тестируются, выкладываются в прод и принимаются задачи?</li><li>Как в целом в команде работают, общаются, передают знания и так далее? Проводится ли code review? Какие порядки? Какие инструменты?</li><li>Выступает ли ваша команда на конференциях? Расскажите о том, как они накладываются на рабочий график. Они оплачиваются компанией? В команде проводятся внутренние митапы с докладами? Предусмотрено ли повышение квалификации?</li></ol><h2>Технические вопросы</h2><p><b>Этап: знакомство с командой, техническое собеседование.</b></p><ol><li>Вы используете Git или другие системы контроля версий?</li><li>Вы используете в работе CI / CD?</li><li>Вы используете системы отслеживания багов, такие как Sentry?</li><li>Вы исправляете баги перед тем, как писать новый код?</li><li>Имеется ли у вас документация проекта?</li><li>Есть ли у вас тестировщики?</li><li>Проводится ли у вас тестирование usability?</li></ol><h2>Подробности о будущем проекте</h2><p><b>Этап: финальный этап, разговор с будущим руководителем.</b></p><ol><li>Как давно начался проект?</li><li>На какой стадии разработки сейчас находится проект?</li><li>Какие технологии применяются в проекте?</li><li>Какие технологии планируются к добавлению в проект?</li><li>Сколько человек задействовано на проекте?</li><li>Кто заказчик проекта?</li><li>Как монетизируется проект?</li><li>Что будет, если завтра прекратится финансирование?</li><li>Можно ли переключаться между проектами?</li><li>С каким кодом придется работать (legacy / новый) и насколько можно его менять?</li><li>Нанимают на поддержку проекта, или на его разработку?</li></ol><h2>Заключение</h2><p>Помните о том, что собеседование — обоюдный процесс, в ходе которого оцениваются не только ваши личностные и профессиональные качества. Работодатель тоже подвергается детальному рассмотрению с вашей стороны. Вам необходимо максимально детально выяснить, какие условия и возможности вам может предложить рассматриваемая вакансия, а также то, с кем и чем вам придется иметь дело каждый рабочий день.</p><p>Самое главное, на чем следует заострить свое внимание — поведение людей, с которыми вы разговариваете на интервью. Вы можете столкнуться с ситуацией, когда реакция на всего один неудобный вопрос может открыть вам глаза на происходящее вокруг, после чего вы сможете со спокойной душой пойти искать вариант получше, и не слишком расстраиваться из-за неудачи на собеседовании.</p><p>Например, если вы обнаруживаете, что в ходе беседы вам говорят что-то в духе “такие вопросы здесь задаем мы” — говорите им “до свидания” и уходите. Это не единственный, но важный красный флаг, которые нельзя упускать из виду.</p><p>Надеюсь, что эти советы и чек-лист помогут вам найти достойную работу, которая будет вам в удовольствие и принесет благо. Удачи!</p>]]></content:encoded>
    </item>
    <item>
      <title>Исчерпывающее руководство по Юникоду и кодировке символов в Python</title>
      <link>https://tproger.ru/translations/unicode-and-encoding-python-guide</link>
      <comments>https://tproger.ru/translations/unicode-and-encoding-python-guide?scrollTo=tproger-comments</comments>
      <dc:creator><![CDATA[Сергей Штукатуров]]></dc:creator>
      <guid isPermaLink="true">https://tproger.ru/translations/unicode-and-encoding-python-guide</guid>
      <description><![CDATA[<p>Как устроены Юникод и UTF-8, чем различаются кодирование и декодирование в Python 3 и почему возникают UnicodeDecodeError и UnicodeEncodeError.</p><p>— Читать дальше «<a rel="follow" href="https://tproger.ru/translations/unicode-and-encoding-python-guide">Исчерпывающее руководство по Юникоду и кодировке символов в Python</a>»</p>]]></description>
      <category><![CDATA[Python]]></category>
      <category><![CDATA[Работа с кодировками]]></category>
      <category><![CDATA[Unicode]]></category>
      <category><![CDATA[Переводы]]></category>
      <slash:comments>0</slash:comments>
      <pubDate>Sat, 22 Jun 2019 08:08:20 GMT</pubDate>
      <content:encoded><![CDATA[<p>Работа с кодировкой символов на Python, да и на любом другом языке, временами выглядит довольно сложной. На Stack Overflow можно найти тысячи вопросов, посвящённых таким исключениям, как UnicodeDecodeError и UnicodeEncodeError. Данное руководство призвано прояснить сложные аспекты работы с этими исключениями и продемонстрировать, что работа с текстовыми и двоичными данными на Python 3 может быть приятной. В Python хорошо реализована поддержка Юникода, однако для работы с кодировкой всё же потребуется приложить усилия.</p><p>Вводная часть статьи даст общее понимание работы с Юникодом, не привязанное к какому-то определённому языку, однако практические примеры будут приведены именно на Python, а их описание будет довольно лаконичным.</p><h4>Изучив эту статью, вы:</h4><ul><li>Освоите концепции кодировки символов и системы нумерации;</li><li>Поймёте, как кодировка работает с объектами str и bytes;</li><li>Узнаете, как в Python поддерживается система нумерации посредством различных форм литералов int;</li><li>Познакомитесь со встроенными функциями языка, относящимися к кодировке и системе нумерации.</li></ul><p>Система нумерации и кодировка символов настолько тесно связаны, что их придётся раскрыть в одном руководстве, в противном случае материал будет неполным.</p><p>Прим. Статья ориентирована на Python 3, а все примеры кода созданы с помощью оболочки CPython 3.7.2. Большая часть более ранних версий Python 3 также будут корректно обрабатывать код. Если вы всё ещё используете Python 2 и различия в обработке текста и бинарных данных между 2 и 3 версиями языка вас отпугивают, это руководство может помочь вам преодолеть барьер.</p><h2>Что такое кодировка символов?</h2><p>Существуют десятки, если не сотни, кодировок символов. Понять эту концепцию легче всего, разобрав одну из самых простых, ASCII.</p><p>Независимо от того, занимаетесь вы самообразованием или получили более формальное образование в сфере IT , наверняка пару раз вы уже видели таблицу ASCII. Эта таблица — хорошее начало для изучения принципов кодировки, так как она простая и маленькая (как вы увидите дальше, даже слишком маленькая).</p><p>Она охватывает следующее:</p><ul><li>Символы английского алфавита в нижнем регистре: от a до z;</li><li>Символы английского алфавита в верхнем регистре: от A до Z;</li><li>Некоторые знаки препинания и символы: например «$» или «!»;</li><li>Символы, отображаемые как пустое место: пробел (« »), символ новой строки, возврата каретки, горизонтальной и вертикальной табуляции и несколько других;</li><li>Некоторые непечатаемые символы: такие как бекспейс, «\b», которые просто невозможно отобразить, так, как к примеру, букву А.</li></ul><p>Приведём формальное определение кодировки символов.</p><p>На самом высоком уровне — это способ перевода символов (таких как буквы, знаки пунктуации, служебные знаки, пробелы и контрольные символы) в целые числа и затем непосредственно в биты. Каждый символ может быть закодирован уникальным двоичным кодом. Если вы плохо знакомы с концепцией битов, не волнуйтесь, мы вскоре о ней поговорим.</p><p>Группы символов выделяют в отдельные категории. Каждому символу соответствует кодовая точка, которую можно рассматривать просто как целое число. В таблице ASCII символы сегментированы следующим образом:</p><figure><img src="https://media.tproger.ru/user-uploads/33794/2024-02-21/b1a78db2-0f7a-45a2-8056-9761281a1b2f.png" alt="" /></figure><p>Всего кодировка ASCII содержит 128 символов. В таблице ниже вы видите исчерпывающий набор знаков, которые позволяет отобразить эта кодировка. Если вы не видите какого-то символа, значит вы просто не сможете его вывести с помощью ASCII.</p><figure><img src="https://media.tproger.ru/user-uploads/33794/2024-02-21/5f40385c-b617-464a-bc6b-87e8063e95fb.png" alt="" /></figure><figure><img src="https://media.tproger.ru/user-uploads/33794/2024-02-21/c80a6048-42a4-48c8-ae19-1a67a5976427.png" alt="" /></figure><figure><img src="https://media.tproger.ru/user-uploads/33794/2024-02-21/ea078928-55b3-4de1-b0b0-d02e9751faa1.png" alt="" /></figure><h3>Модуль string</h3><p>Модуль string — простой и удобный инструмент, разграничивающий содержащиеся в ASCII символы по группам, разделяя их в строки-константы. Вот как выглядит основная часть модуля:</p><p>Большинство этих констант исчерпывающе описаны их идентификаторами. Мы вкратце коснёмся констант hexdigits и octdigits.</p><p>Мы можем использовать определённые в модуле константы для рутинных операций:</p><p>Прим. Обратите внимание, string.printable включает string.whitespace. Это несколько не соответствует тому, как печатаемые символы определяет метод str.isprintable(), который не рассматривает ни один из символов {'\v', '\n', '\r', '\f', '\t'} как печатаемый.</p><p>Это различие происходит из определения метода: str.isprintable() рассматривает что-либо печатаемым, если «все символы рассматриваются как печатаемые методом repr().</p><h3>Что такое биты</h3><p>Настало время вспомнить, что такое бит, базовая единица информации, которой оперируют вычислительные устройства.</p><p>Бит — это сигнал, который имеет два возможных состояния. Есть различные способы символического отображения этих состояний:</p><ul><li>0 или 1;</li><li>«да» или «нет»;</li><li>True или False;</li><li>«включено» или «выключено».</li></ul><p>Таблица ASCII из предыдущего раздела использует то, что обычно назвали бы числами (от 0 до 127), однако для наших целей важно понимать, что это десятичные числа (с основанием 10).</p><p>Каждое из этих десятичных чисел можно выразить последовательностью бит (числом с основанием 2). Вот таблица соотношения двоичных и десятичных чисел:</p><figure><img src="https://media.tproger.ru/user-uploads/33794/2024-02-21/29efc38f-afba-4116-81c2-c30683cad6b9.png" alt="" /></figure><p>Обратите внимание, что при увеличении десятичного числа n для его отображения (а следовательно и для отображения символа, относящегося к этому числу) требуется всё больше значимых бит.</p><p>Вот удобный метод представить строки ASCII как последовательность бит. Каждый символ из строки ASCII переводится в последовательность из 8 нолей и единиц с пробелами между этими последовательностями:</p><p>Прим. Обратите внимание, что метод .isascii() появился в Python 3.7.</p><p>Строковой литерал <a href="https://realpython.com/python-f-strings/">f-string</a> f"{ord(i):08b}" использует мини-язык форматирования <a href="https://docs.python.org/3/library/string.html#formatspec">Format Specification Mini-Language</a>, а именно его возможность замещения полей при форматировании строк.</p><ul><li>левая часть выражения, ord(i), представляет объект, значение которого будет отформатировано и отображено при выводе. ord() возвращает кодовую точку одиночного символа str в десятичном выражении;</li><li>Правая сторона выражения определяет форматирование объекта. 08 означает ширина 8, заполнение нулями, а b работает как команда вывести число в двоичном (binary) эквиваленте.</li></ul><p>На самом деле этот метод можно использовать разве что для развлечения. Он выдаст ошибку для любого символа, не представленного в ASCII-таблице. Позже мы рассмотрим, как эта проблема решается в других кодировках.</p><h3>Нам нужно больше бит</h3><p>Исходя из определения бита, можно вывести следующую закономерность: при определённом количестве бит n с их помощью можно выразить 2n разных значений.</p><p>Вот что это означает:</p><ul><li>1 бит позволяет выразить 21 == 2 возможных значения;</li><li>8 бит позволяют выразить 28 == 256 возможных значений;</li><li>64 бита позволяют выразить 264 == 18 446 744 073 709 551 616 возможных значений.</li></ul><p>В качестве естественного вывода из приведённой выше формулы мы можем установить следующее: для того, чтобы вычислить количество бит, необходимых для выражения определённого числа разных значений, нам нужно найти n в уравнении 2n=x, где переменная x известна.</p><p>Вот как можно это рассчитать:</p><p>Округление вверх в методе n_bits_required() требуется для расчёта значений, которые не являются чистой степенью двойки. К примеру, вам нужно сохранить набор из 110 различных символов. Для этого потребуется log(110) / log(2) == 6.781 бит, но поскольку бит для вычислительной техники является мельчайшей неделимой величиной, для отображения 110 различных значений нам понадобится 7 бит, при этом несколько значений останутся невостребованными.</p><p>Всё сказанное служит для обоснования одной идеи: ASCII, строго говоря, семибитная кодировка. Эта таблица содержит 128 кодовых точек, и, соответственно, символов, от 0 до 127 включительно. Это требует 7 бит:</p><p>Проблема заключается в том, что современные компьютеры не используют для хранения чего-либо семибитные последовательности. Основной единицей хранения информации современных вычислительных устройств являются восьмибитные последовательности, байты.</p><p>Прим. В этой статье под байтом подразумевается группа из 8 бит, как повелось с 60-х годов прошлого века. Если вам не по душе это новомодное название, можете называть их <a href="https://en.wikipedia.org/wiki/Octet_(computing)">октетами</a>.</p><p>То, что ASCII-таблица использует 7 бит из доступных 8, означает, что память вычислительного устройства, занятого строками символов ASCII, наполовину пуста. Для того, чтобы лучше понять, почему это происходит, вернитесь к приведённой выше таблице соответствия двоичных и десятичных чисел. Вы можете выразить числа 0 и 1 с помощью 1 бита, или вы можете использовать 8 бит, чтобы выразить их как 00000000 и 00000001 соответственно.</p><p>Прим. перев. Если быть точным, то пустой остаётся только одна восьмая часть памяти. Однако с помощью именно этого незадействованного бита можно было бы создать вдвое больше кодовых точек.</p><p>Вы можете выразить числа от 0 до 3 всего двумя битами, от 00 до 11, или использовать 8 бит, чтобы выразить их как 00000000, 00000001, 00000010 и 00000011. Самая большая кодовая точка ASCII, 127, требует только 7 значимых бит.</p><p>С учётом этого взгляните, как метод make_bitseq() преобразует строки ASCII в строки, состоящие из байт, где каждый символ требует один байт:</p><p>Неэффективное использование восьмибитной структуры памяти современных вычислительных устройств привело к появлению неструктурированного семейства конфликтующих кодировок, задействующих оставшуюся незанятой половину кодовых точек, доступных в одном байте.</p><p>Несмотря на попытку задействовать дополнительный бит, эти конфликтующие кодировки не могли отобразить все возможные символы, используемые человечеством в письменности.</p><p>Со временем появилась одна большая схема кодировки, которая объединила их. Однако, прежде чем мы до этого доберёмся, поговорим немного о краеугольных камнях схем кодировки символов — системах счисления.</p><h2>Изучаем основы: другие системы счисления</h2><p>В ASCII-таблице, как мы увидели, каждый символ соответствует числу от 0 до 127.</p><p>Этот диапазон чисел выражен в десятичной системе счисления. Именно эту систему используют для счёта люди, просто потому что на руках у нас по 10 пальцев.</p><p>Однако существуют и другие системы счисления, которые, в частности, широко используются в исходном коде CPython. Следует понимать, что действительное число не изменяется, а системы счисления просто по-разному его выражают.</p><p>Вопрос, какое число записано в строке "11" покажется странным, ведь для большинства очевидно, что это одиннадцать.</p><p>Однако в строке может быть представлено и другое число, в зависимости от системы счисления. Помимо десятичной, используются такие общепринятые альтернативы:</p><ul><li>Двоичная: с основой 2;</li><li>Восьмеричная: с основой 8;</li><li>Шестнадцатеричная (hex): с основой 16.</li></ul><p>Что же мы подразумеваем, говоря что определённая система счисления имеет основу N?</p><p>Один из способов объяснения разных систем счисления заключается в том, чтобы представить, что у вас N пальцев.</p><p>Если же вам требуется более подробное объяснение систем счисления, обратитесь к книге Чарльза Петцольда <b>«</b>Код<b>». </b>В этой книге детально объясняются основы работы вычислительной техники.</p><p>Конструктор int() — один из способов показать, как разные системы счисления преобразуют одну и ту же строку с помощью Python. Если вы передадите str в int(), Python по умолчанию будет считать, что строка содержит число в десятичной системе. Однако вы можете дать другие указания:</p><p>Чаще в Python для обозначения того, что целое число представлено в системе счисления, отличной от десятичной, используют префиксы-литералы. Для каждой из трёх альтернативных систем существует свой литерал.</p><figure><img src="https://media.tproger.ru/user-uploads/33794/2024-02-21/47e8aa23-b556-4e70-ba20-6da8dfb90b0b.png" alt="" /></figure><p>Всё это — разновидности целочисленных литералов. Результаты применения префиксов будут такими же, как и в случае использования int() с определением параметра base. Для Python всё это просто целые числа:</p><p>В таблице ниже отражено, как можно ввести десятичные числа от 0 до 20 в двоичном, восьмеричном и шестнадцатеричном эквиваленте. Любой из этих способов можно использовать как в оболочке интерпретатора Python, так и в исходном коде, и все эти числа будут рассматриваться как относящиеся к типу int.</p><figure><img src="https://media.tproger.ru/user-uploads/33794/2024-02-21/d21947f5-677c-4f3d-8e39-4045175960d8.png" alt="" /></figure><p>Кстати, вы можете сами убедиться, что подобные способы записи чисел очень часто используется в Стандартной Библиотеке Python. Найдите папку lib/python3.7/ в своей системе, перейдите в неё и введите команду:</p><p>Команда сработает в любой Unix-системе с утилитой grep. С её помощью вы найдёте все шестнадцатеричные литералы. Для поиска двоичных используйте \b0b, а для восьмеричных — \b0o.</p><p>Для чего же нужны альтернативные литералы целых чисел? Если коротко, числа 2, 8 и 16, в отличие от 10, являются степенями двойки. Основанные на них системы счисления выражают численные значения способами, более удобными для обработки бинарными вычислительными устройствами. К примеру, 65536, или 216, в шестнадцатеричной системе просто 10000 или, используя литерал, 0x10000.</p><h2>Введение в Юникод</h2><p>Как видите, проблема ASCII в том, что этой таблицы недостаточно для отображения знаков, символов и глифов, использующихся во всех языках и диалектах мира. Её <a href="https://en.wikipedia.org/wiki/English_terms_with_diacritical_marks">недостаточно</a> даже для английского языка.</p><p>Юникод служит тем же целям, что и ASCII, но содержит намного больший набор кодовых точек. В период времени между появлением ASCII и принятием Юникода использовалось ещё несколько различных кодировок, но рассматривать их подробно нет смысла, так как Юникод и одна из его схем, UTF-8, в настоящее время стали использоваться практически повсеместно.</p><p>Вы можете представить Юникод как расширенную версию ASCII-таблицы — с 1 114 112 возможными кодовыми точками, от 0 до 1 114 111. Это 17*(216) или 0x10ffff в шестнадцатеричном представлении. Фактически, ASCII является частью Юникода, так как первые 128 символов этих кодировок полностью совпадают.</p><p>Чтобы соблюсти технические детали, сам по себе Юникод не является кодировкой. Он скорее реализуется в различных кодировках символов, как вы вскоре увидите. По структуре Юникод скорее ассоциативный массив (что-то вроде dict) или база данных, состоящая из таблицы с двумя колонками. В этой таблице разные символы (такие как "a", "¢", или даже "ቈ") соотносятся с различными целыми положительными числами. Кодировка же должна предоставлять несколько больше возможностей.</p><p>Юникод содержит практически любой символ, который только можно представить, включая дополнительные непечатаемые. Например, кодовая точка 8207 соответствует отметке RTL, которая используется для смены направления письма. Она полезна в текстах, где абзацы на одном из европейских языков соседствуют с абзацами на арабских языках.</p><p>Прим. Кстати, если уж мы хотим быть совсем точны в деталях, то надо отметить ещё один факт. <a href="https://www.quora.com/How-do-you-determine-how-many-characters-Unicode-can-store">Исторически сложилось</a>, что в Юникоде доступны только 1 111 998 кодовых точек.</p><h3>Юникод и UTF-8</h3><p>Довольно скоро стало понятно, что все необходимые символы невозможно вместить в таблицу, используя только один байт. Современные, более ёмкие кодировки требовали использования больших объёмов.</p><p>Ранее мы упоминали, что Юникод сам по себе не является кодировкой. И вот почему.</p><p>Юникод не содержит указаний по извлечению из текста бит, он работает только с кодовыми точками. В нём нет стандарта конверсии текста в двоичные данные и обратно.</p><p>Юникод является абстрактным стандартом кодировки. Для практического его применения чаще всего используют схему UTF-8. Стандарт Юникод (таблица соответствий символов кодовыми точкам) определяет несколько различных кодировок на основе единого набора символов.</p><p>Как и менее распространённые UTF-16 и UTF-32, UTF-8 — формат кодировки для отображения символов Юникода в двоичном виде, используя один или несколько байт на один символ. UTF-16 и UTF-32 мы обсудим чуть позже, но пока нам интересен UTF-8 как самый популярный формат.</p><p>Сначала требуется разобрать термины «‎‎кодирование»‎ и «‎декодирование»‎.</p><h3>Кодирование и декодирование в Python 3</h3><p>Тип данных str в Python 3 рассчитан на представление текста в удобном для чтения формате и может содержать любые символы Юникода.</p><p>Тип bytes, напротив, представляет двоичные данные, последовательность байт, без указания на кодировку.</p><p>Кодирование и декодирование — это процесс перехода данных из одной формы в другую.</p><figure><img src="https://media.tproger.ru/uploads/2019/06/encode-decode.png" alt="" /></figure><p>В методах .encode() и .decode() по умолчанию используется параметр "utf-8", однако для большей уверенности этот параметр можно определить самостоятельно:</p><p>str.encode() возвращает объект типа <a href="https://docs.python.org/3/library/stdtypes.html#bytes-objects">bytes</a>. И литералы этого типа объектов (такие как b"r\xc3\xa9sum\xc3\xa9"), и его отображение допускают только символы ASCII.</p><p>Вот почему при вызове "El Niño".encode("utf-8"), ASCII-совместимое "El" отображается как есть, а n с тильдой экранируется в "\xc3\xb1". Этой с виду неудобочитаемой последовательностью представлены два байта, 0xc3 и 0xb1 в шестнадцатеричной системе:</p><p>Таким образом <a href="https://unicode-table.com/en/00F1/">символ ñ</a> требует два байта для бинарного представления с помощью UTF-8.</p><p>Прим. Если вы введёте help(str.encode), скорее всего, увидите параметр по умолчанию encoding='utf-8'. Однако имейте в виду, что настройки Windows для Python 3.6 <a href="https://docs.python.org/3/whatsnew/3.6.html#pep-528-change-windows-console-encoding-to-utf-8">могут отличаться</a>, поэтому использовать методы кодирования и декодирования без указания необходимой кодировки (например "résumé".encode()) следует с осторожностью.</p><h3>Python 3: всё на Юникоде</h3><p>Python 3 полностью реализован на Юникоде, а точнее на UTF-8. Вот что это означает:</p><ul><li>По умолчанию предполагается, что исходный код Python 3 написан с помощью UTF-8. Это значит, что вам не нужно использовать определение # -*- coding: UTF-8 -*- в начале файлов .py в этой версии языка.</li><li>Все тексты (объекты формата str) реализованы на Юникоде. Кодированный текст представлен двоичными данными (bytes). Тип strможет содержать любой символ-литерал из Юникода (например "Δv / Δt"), и все они хранятся в Юникоде.</li><li>Любой из символов Юникода приемлем в качестве идентификатора. Например, вы можете использовать выражение résumé = "~/Documents/resume.pdf".</li><li>В модуле <a href="https://docs.python.org/3/library/re.html">re</a> по умолчанию установлен флаг re.UNICODE, а не re.ASCII. Это означает, что r"\w" соответствует буквам из Юникода, а не просто символам ASCII.</li><li>По умолчаниюencoding в str.encode() в bytes.decode() установлен в UTF-8.</li></ul><p>Нужно отметить также нюанс, касающийся встроенного метода open(). Его параметр encoding зависит от платформы и определяется значением locale.getpreferredencoding():</p><p>Мы делаем упор на эти моменты, чтобы вы вдруг не подумали, что кодировка UTF-8 является универсальной. Она действительно широко распространена, но вы вполне можете столкнуться и с другими вариантами. Не будет лишним предусмотреть это в коде.</p><h3>Один байт, два байта, три байта, четыре…</h3><p>Одна из важнейших особенностей UTF-8 состоит в том, что это кодировка с переменным размером.</p><p>Вспомните раздел, посвящённый ASCII. Любой символ в этой таблице требует максимум одного байта пространства. Это можно быстро проверить с помощью следующего генератора:</p><p>С UTF-8 дела обстоят по-другому. Символы Юникода могут занимать от одного до четырёх байт. Вот пример четырёхбайтного символа:</p><p>Это небольшая, но важная особенность метода len():</p><ul><li>Размер единичного символа Юникода в объекте str языка Python всегда будет равен 1, вне зависимости от количества занимаемых байт.</li><li>Длина того же символа в объекте типа bytes будет варьироваться от 1 до 4.</li></ul><p>Таблица ниже показывает, сколько байт занимают основные типы символов.</p><figure><img src="https://media.tproger.ru/user-uploads/33794/2024-02-21/1a2fbf5c-ecc7-4048-bae9-f65e2ae7cc8e.png" alt="" /></figure><p>*Такие как английский, арабский, греческий, ирландский.<br />**Масса языков и символов, в основном китайский, японский и корейский с разделением по томам (а также ASCII и латиница).<br />***Дополнительные символы китайского, японского, корейского и вьетнамского, а также другие символы и эмоджи.</p><p>Прим. У UTF-8 есть и другие технические особенности. Те, кто работает на Python, редко с ними сталкиваются, поэтому мы не будем раскрывать их в этой статье, но упомянем вкратце, чтобы сохранить полноту картины. Так, UTF-8 использует коды-префиксы, указывающие на количество байт в последовательности. Такой приём позволяет декодеру группировать байты в условиях кодировки с переменным размером. Количество байт в последовательности определяется первым её байтом. Другие технические подробности можно найти на <a href="https://ru.wikipedia.org/wiki/UTF-8">странице Википедии</a>, посвящённой UTF-8 или на <a href="http://www.unicode.org/versions/latest/">официальном сайте</a>.</p><h3>Особенности UTF-16 и UTF-32</h3><p>Рассмотрим альтернативные кодировки, UTF-16 и UTF-32. Различие между ними и UTF-8 в основном практическое. Продемонстрируем величину расхождения с помощью перевода туда и обратно:</p><p>В данном случае, когда мы кодируем четыре буквы греческого алфавита в двоичные данные с помощью UTF-8, а декодируем обратно в текст с использованием UTF-16, на выходе получается строка с совершенно другими символами (из корейского алфавита).</p><p>Так происходит, если для кодирования и декодирования применяют разные кодировки. Два варианта декодирования одного бинарного объекта могут вернуть текст даже на другом языке.</p><p>Таблица ниже демонстрирует количество байт, используемых в разных кодировках:</p><figure><img src="https://media.tproger.ru/user-uploads/33794/2024-02-21/bbd21923-d72a-4acc-95d5-942281511af9.png" alt="" /></figure><p>Любопытный аспект семейства UTF: UTF-8 не всегда занимает меньше памяти, чем UTF-16. Хотя с точки зрения математики это выглядит маловероятным, однако это возможно:</p><p>Так получается из-за того, что кодовые точки в диапазоне от U+0800 до U+FFFF (от 2048 до 65535 в десятичной системе) в кодировке UTF-8 занимают три байта, а в UTF-16 только два.</p><p>Это не означает, что нужно работать с UTF-16, независимо от того, насколько часто вы работаете с символами в этом диапазоне. Один из самых важных поводов придерживаться UTF-8 — в мире кодировок лучше держаться вместе с большинством.</p><p>Кроме того, в 2019 году компьютерная память стоит дёшево, и экономия четырёх байт за счёт использования нестандартной кодировки вряд ли стоит усилий.</p><p>Прим. перев. Есть и более весомые причины использовать UTF-8. Среди них её обратная совместимость с ASCII, а также то, что это самосинхронизирующаяся кодировка.</p><h2>Python и встроенные функции</h2><p>Вы освоили самую сложную часть статьи. Теперь посмотрим, как всё изученное реализуется на Python.</p><p>В Python есть несколько встроенных функций, каким-либо образом относящихся к системам счисления и кодировке:</p><ul><li><a href="https://docs.python.org/3/library/functions.html#ascii">ascii()</a></li><li><a href="https://docs.python.org/3/library/functions.html#bin">bin()</a></li><li><a href="https://docs.python.org/3/library/functions.html#bytes">bytes()</a></li><li><a href="https://docs.python.org/3/library/functions.html#chr">chr()</a></li><li><a href="https://docs.python.org/3/library/functions.html#hex">hex()</a></li><li><a href="https://docs.python.org/3/library/functions.html#int">int()</a></li><li><a href="https://docs.python.org/3/library/functions.html#oct">oct()</a></li><li><a href="https://docs.python.org/3/library/functions.html#ord">ord()</a></li><li><a href="https://docs.python.org/3/library/functions.html#str">str()</a></li></ul><p>Логически их можно сгруппировать по назначению.</p><ul><li>ascii(), bin(), hex() и oct() предназначены для различного представления вводных данных. Все они возвращают str. Первая, ascii(), производит представление объекта в ASCII, экранируя не входящие в эту таблицу символы. Оставшиеся три дают соответственно двоичное, шестнадцатеричное и восьмеричное представление целого числа. Все эти функции меняют только представление объекта, не изменяя непосредственно вводные данные.</li><li>bytes(), str() и int() — конструкторы классов соответствующих типов: bytes, str, и int. Все они предлагают способы подогнать данные под желаемый тип.</li><li>ord() и chr() выполняют противоположные действия. ord() конвертирует символ в десятичную кодовую точку, а chr() принимает в качестве аргумента целое число, и возвращает символ, кодовой точкой которого это число является.</li></ul><p>В таблице ниже эти функции разобраны более подробно:</p><figure><img src="https://media.tproger.ru/user-uploads/33794/2024-02-21/297e0827-8aa8-48ed-8eb6-8a4587d7c747.png" alt="" /></figure><p>Дальше можно посмотреть полезные примеры использования этих функций.</p><h2>Литералы для строк на Python</h2><p>Вместо использования конструктора str(), объект этого типа чаще вводят напрямую:</p><p>Выглядит достаточно просто. Но есть один аспект, о котором нужно помнить. Поскольку Python позволяет использовать все возможности Юникода, можно «напечатать» символы, которых вы никогда не найдёте на клавиатуре. Можно скопировать и вставить их прямо в оболочку интерпретатора:</p><p>Кроме ввода через консоль реальных, неэкранированых символов Юникода, существуют и другие способы ввода текстовых строк.</p><p>Самые насыщенные разделы документации Python посвящены лексическому анализу. В частности, раздел о <a href="https://docs.python.org/3/reference/lexical_analysis.html#string-and-bytes-literals">строках и литералах</a>. Возможно, для понимания данного аспекта языка этот раздел придётся неоднократно перечитать.</p><p>Кроме прочего, там говорится о шести возможных способах ввода одного символа Юникода.</p><p>Первый, и самый распространённый метод, как вы уже видели — прямой ввод. Проблема состоит в поиске необходимых сочетаний клавиш. Здесь и могут пригодиться другие способы получения и представления символов. Вот полный список:</p><figure><img src="https://media.tproger.ru/user-uploads/33794/2024-02-21/fb0a550a-3fa4-45b0-8471-365306769daf.png" alt="" /></figure><p>Это соответствие можно проверить на практике:</p><p>Нужно однако упомянуть и два основных затруднения при использовании этих методов:</p><ol><li>Не каждый способ работает со всеми символами. Шестнадцатеричное представление числа 300 выглядит как 0x012c, а это значение просто не поместится в экранирующий код "\xhh", так как в нём допускаются всего две цифры. Самая большая кодовая точка, которую можно втиснуть в этот формат — "\xff" ("ÿ"). Аналогичо "\ooo" можно использовать только до "\777" ("ǿ").</li><li>Для \xhh, \uxxxx, и \Uxxxxxxxx требуется вводить ровно столько цифр, сколько указано в примерах. Это может стать неприятным сюрпризом, поскольку обычно основанные на Юникоде таблицы содержат кодовые точки для символов с префиксом U+ и варьирующимся количеством шестнадцатеричных символов. В этих таблицах кодовые точки отображают только значимые цифры.</li></ol><p>Например, если вы обратитесь к сайту <a href="https://unicode-table.com/en/10336">unicode-table.com</a> с целью получить данные готического символа faihu (или fehu), "?", его кодовая точка будет U+10346.</p><p>Как же можно разместить его в "\uxxxx" или "\Uxxxxxxxx"? В "\uxxxx" эту кодовую точку вместить невозможно, поскольку она соответствует четырёхбайтному символу. А чтобы представить его в "\Uxxxxxxxx", придётся выровнять последовательность с левой стороны:</p><p>Это также значит, что экранирующая последовательность "\Uxxxxxxxx" — единственная последовательность, способная вместить любой символ Юникода.</p><p>Прим. Вот код небольшой, но удобной функции, переводящей записи типа "U+10346" в приемлемый для Python формат с помощью str.zfill():</p><h2>Другие поддерживаемые Python кодировки</h2><p>Пока что мы рассказали про 4 разные кодировки символов:</p><ol><li>ASCII;</li><li>UTF-8;</li><li>UTF-16;</li><li>UTF-32.</li></ol><p>Однако существует большое количество и других вариантов кодировки.</p><p>Один из примеров — Latin-1 (другое название ISO-8859-1). Это базовая кодировка для Hypertext Transfer Protocol (HTTP) в спецификации <a href="https://tools.ietf.org/html/rfc2616#section-3.7.1">RFC 2616</a>. Для Windows существует собственный вариант Latin-1, который называется cp1252.</p><p>Прим. Кодировка ISO-8859-1 всё ещё широко используется. Библиотека <a href="https://realpython.com/python-requests/">requests</a> неукоснительно придерживается спецификации RFC 2616, используя её по умолчанию для содержимого отзывов HTTP/HTTPS. Если в заголовке Content-Type находится слово «text» и не выбрана другая кодировка, requests <a href="https://github.com/kennethreitz/requests/blob/75bdc998e2d430a35d869b2abf1779bd0d34890e/requests/utils.py#L473">использует ISO-8859-1</a>.</p><p><a href="https://docs.python.org/3/library/codecs.html#standard-encodings">Полный список</a> допустимых кодировок можно найти в документации модуля codecs, входящего в набор стандартных библиотек Python.</p><p>Среди этих кодировок стоит упомянуть ещё одну, зачастую весьма полезную. Это "unicode-escape". Если вы декодировали str и хотите быстро получить представление содержащихся в ней экранированных литералов Юникода, можно определить эту кодировку в .encode:</p><h2>Вы знаете, что говорят насчёт предположений…</h2><p>Хотя Python по умолчанию предполагает, что файлы и код созданы на основе кодировки UTF-8, вам, как программисту, не следует делать аналогичное предположение относительно сторонних данных.</p><p>Когда вы получаете данные в двоичном коде из внешних источников, из файла или по сетевому соединению, стоит проверить, указана ли кодировка. Если нет — вы можете уточнить.</p><p>Все операции ввода-вывода осуществляют в байтах, наборе нулей и единиц, пока вы не сообщите системе кодировку для преобразования этих данных в текст.</p><p>Приведём пример того, что может пойти не так. Допустим, вы подписаны на API, который передаёт вам рецепт блюда дня. Вы получаете его в формате bytes и раньше всегда без проблем декодировали с использованием .decode("utf-8") . Но именно в этот день часть рецепта выглядела так:</p><p>Похоже, нам потребуется мука, но сколько?</p><p>А вот и та самая неприятная ошибка UnicodeDecodeError. Подобное вполне может произойти, когда вы делаете предположение об используемой кодировке. Уточняем у разработчика ресурса, предоставляющего API. Выясняется, что полученный вами файл был закодирован с помощью  Latin-1:</p><p>Именно в этом и крылась проблема. В <a href="https://en.wikipedia.org/wiki/ISO/IEC_8859-1#Code_page_layout">Latin-1</a> каждый символ кодируется одним байтом, в вот в UTF-8 символ «¼» требует два байта ("\xc2\xbc").</p><p>Как видите, делать предположения относительно кодировки полученных данных довольно рискованно. Обычно это UTF-8, однако в тех случаях, когда это не так, у вас могут возникнуть проблемы.</p><p>Если уж у вас нет другого выхода и кодировку приходится угадывать, обратите внимание на библиотеку <a href="https://chardet.readthedocs.io/en/latest/">chardet</a>. В ней используются разработанные в Mozilla методы, позволяющие сделать обоснованное предположение насчёт кодировки данных. Однако учтите, что такие инструменты должны быть вашим последним средством, не стоит прибегать к ним, если есть возможность решить вопрос другим способом.</p><h2>Всякая всячина: unicodedata</h2><p>Нельзя не упомянуть также модуль <a href="https://docs.python.org/3/library/unicodedata.html">unicodedata</a>. Он позволяет взаимодействовать с базой данных символов Юникода (Unicode Character Database, UCD).</p><h2>Подводим итоги</h2><p>Итак, в этой статье вы познакомились со следующими концепциями кодировки символов в Python:</p><ul><li>Фундаментальные принципы кодировки символов и систем счисления;</li><li>Целочисленные, двоичные, восьмеричные, шестнадцатеричные, строковые и байтовые литералы в Python;</li><li>Встроенные функции языка, работающие с кодировкой и системами счисления;</li><li>Особенности обработки текстовых и двоичных данных.</li></ul><h2>Дополнительные источники</h2><p>Ещё больше информации можно получить из следующих материалов (на английском языке):</p><ul><li><a href="https://utf8everywhere.org/#">UTF-8 Everywhere Manifesto</a>.</li><li><a href="https://www.joelonsoftware.com/2003/10/08/the-absolute-minimum-every-software-developer-absolutely-positively-must-know-about-unicode-and-character-sets-no-excuses/">Joel Spolsky</a>: Минимальный уровень знаний о Юникоде и наборах символов, требующийся каждому разработчику ПО (Без отговорок!).</li><li><a href="http://kunststube.net/encoding/">David Zentgraf</a>: Что обязательно должен знать о кодировках и наборах символов каждый программист для работы с текстом.</li><li><a href="https://www-archive.mozilla.org/projects/intl/UniversalCharsetDetection.html">Mozilla</a>: Комплексный подход к определению языков и кодировок.</li><li><a href="https://en.wikipedia.org/wiki/UTF-8">Wikipedia</a>.</li><li><a href="http://csharpindepth.com/Articles/General/Unicode.aspx">John Skeet</a>: Юникод и .NET.</li><li>Network Working Group, <a href="https://tools.ietf.org/html/rfc3629">RFC 3629</a>: UTF-8, формат преобразования ISO 10646.</li><li>Unicode <a href="https://unicode.org/reports/tr18/">Technical Standard</a> #18: Регулярные выражения Юникода.</li></ul><p>В документации языка нашему вопросу посвящены два раздела:</p><ul><li><a href="https://docs.python.org/3.0/whatsnew/3.0.html#text-vs-data-instead-of-unicode-vs-8-bit">What’s New in Python 3.0</a>;</li><li><a href="https://docs.python.org/3/howto/unicode.html#unicode-howto">Unicode HOWTO</a>.</li></ul>]]></content:encoded>
    </item>
    <item>
      <title>Для видеокодека AV1 разработан новый декодировщик</title>
      <link>https://tproger.ru/news/av1-lib-video-dav1d</link>
      <comments>https://tproger.ru/news/av1-lib-video-dav1d?scrollTo=tproger-comments</comments>
      <dc:creator><![CDATA[Андрей Галадей]]></dc:creator>
      <guid isPermaLink="true">https://tproger.ru/news/av1-lib-video-dav1d</guid>
      <description><![CDATA[<p>Библиотека dav1d от VideoLAN и FFmpeg декодирует свободный формат AV1, написана на Си со вставками ассемблера и выходит под лицензией BSD.</p><p>— Читать дальше «<a rel="follow" href="https://tproger.ru/news/av1-lib-video-dav1d">Для видеокодека AV1 разработан новый декодировщик</a>»</p>]]></description>
      <category><![CDATA[Open Source]]></category>
      <category><![CDATA[Компьютерная графика]]></category>
      <category><![CDATA[Работа с кодировками]]></category>
      <category><![CDATA[Новости]]></category>
      <slash:comments>0</slash:comments>
      <pubDate>Tue, 02 Oct 2018 17:57:21 GMT</pubDate>
      <content:encoded><![CDATA[<p>Специалисты из проектов VideoLAN и FFmpeg представили совместную разработку — библиотеку dav1d, которая поддерживает свободный формат кодирования видео AV1. Она написана на Cи со вставками из ассемблера. Библиотека <a href="https://code.videolan.org/videolan/dav1d">распространяется</a> под лицензией BSD.</p><h3>Что известно об AV1?</h3><p>Этот открытый стандарт сжатия видео, разработанный альянсом Open Media (AOMedia), в его состав входит ряд крупных IT-компаний: Google, Microsoft, Intel, NVIDIA, IBM, Netflix и другие. Судя по внутренним тестам, стандарт опережает актуальные форматы H.264 и VP9 на 34–50 % по сжатию при сохранении того же качества. Также он потенциально на 20 % превосходит кодек HEVC.</p><h3>Зачем нужна библиотека dav1d?</h3><p>Главной задачей библиотеки является максимальная производительность при использовании технологии сжатия видео на разных платформах. Это позволит минимизировать эффект отсутствия аппаратного ускорения на первых этапах внедрения AV1, а также обеспечить работу в многопоточных приложениях. Ещё одной задачей является сохранение компактности программного кода.</p><p>Декодер dav1d включает на порядок меньше кода, чем штатный декодер AV1 под названием libaom. Размер его бинарного файла меньше в три раза, а потреблении памяти — в четыре. Новый декодеровщик опережает в многопоточном декодировании libaom 1.0.0, однако пока уступает версии libaom из HEAD-ветки.</p><p>На сегодняшний день dav1d поддерживает процессорные архитектуры x86, x64, ARMv7 и ARMv8, а также операционные системы Linux, Windows, macOS, Android и iOS. Проект спонсирует Open Media, и хотя библиотека уже готова для тестов, использовать её в ежедневной работе не рекомендуется. В будущем планируется добавить в декодировщик расширенные возможности AV1, в числе которых управление глубиной цвета и все виды цветовой субдискретизации.</p><p>Кодек AV1 <a href="https://tproger.ru/news/open-media-av1-codec-release/">выпустили</a> весной 2018 года. Он поддерживает разрешение до 4K и обеспечивает высокий уровень сжатия при минимальной потере качества. В апреле его <a href="https://tproger.ru/news/av1-benchmark-results/">протестировали</a> в Facebook.</p>]]></content:encoded>
    </item>
    <item>
      <title>Facebook протестировала видеокодек AV1: новый формат обошел x264 и libvpx-vp9 по уровню сжатия</title>
      <link>https://tproger.ru/news/av1-benchmark-results</link>
      <comments>https://tproger.ru/news/av1-benchmark-results?scrollTo=tproger-comments</comments>
      <dc:creator><![CDATA[Дмитрий Сироткин]]></dc:creator>
      <guid isPermaLink="true">https://tproger.ru/news/av1-benchmark-results</guid>
      <description><![CDATA[<p>Facebook сравнила AV1, x264 и libvpx-vp9 на 400 видео: новый кодек дал лучшее сжатие, но проиграл конкурентам по времени кодирования.</p><p>— Читать дальше «<a rel="follow" href="https://tproger.ru/news/av1-benchmark-results">Facebook протестировала видеокодек AV1: новый формат обошел x264 и libvpx-vp9 по уровню сжатия</a>»</p>]]></description>
      <category><![CDATA[Компьютерная графика]]></category>
      <category><![CDATA[Работа с кодировками]]></category>
      <category><![CDATA[Новости]]></category>
      <slash:comments>0</slash:comments>
      <pubDate>Sat, 14 Apr 2018 22:28:15 GMT</pubDate>
      <content:encoded><![CDATA[<p>Инженеры Facebook <a href="https://code.facebook.com/posts/253852078523394/av1-beats-x264-and-libvpx-vp9-in-practical-use-case/">протестировали</a> открытый видеокодек <a href="https://aomedia.org/av1-features/">AV1</a> в сравнении с <a href="https://ru.wikipedia.org/wiki/X264">x264</a> и <a href="https://ru.wikipedia.org/wiki/VP9">libvpx-vp9</a> на 400 популярных видеороликах в различных разрешениях. Эффективность сжатия измерялась методом BD-rate для оценки достижимости нижней границы битрейта как при неизменном пиковом отношении сигнала к шуму (<a href="https://ru.wikipedia.org/wiki/%D0%9F%D0%B8%D0%BA%D0%BE%D0%B2%D0%BE%D0%B5_%D0%BE%D1%82%D0%BD%D0%BE%D1%88%D0%B5%D0%BD%D0%B8%D0%B5_%D1%81%D0%B8%D0%B3%D0%BD%D0%B0%D0%BB%D0%B0_%D0%BA_%D1%88%D1%83%D0%BC%D1%83">PSNR</a>), так и при индексе структурного сходства (<a href="https://ru.wikipedia.org/wiki/SSIM">SSIM</a>).</p><h3>Результаты тестирования</h3><p>AV1 опередил x264 (main profile) на 50,3 %, x264 (high profile) на 46,2 % и libvpx-vp9 на 34,0 % по уровню сжатия, но вследствие усложненных алгоритмов ожидаемо проиграл им по времени кодирования. Разрешения UHD/4K и 8K были принципиально исключены из тестирования, так как эффективность нового видеокодека возрастает с увеличением разрешения.</p><p>Оценка PSNR (экономия битрейта по сравнению с x264 и libvpx-vp9):</p><figure><img src="https://media.tproger.ru/uploads/2018/04/AV1_PSNR.jpg" alt="" /></figure><p>Оценка SSIM:</p><figure><img src="https://media.tproger.ru/uploads/2018/04/AV1_SSIM.jpg" alt="" /></figure><p>Скорость кодирования:</p><figure><img src="https://media.tproger.ru/uploads/2018/04/AV1_encoding_time_ratio.jpg" alt="" /></figure><p>Каждое видео дополнительно было пропущено через двухпроходный режим стриминга с адаптивным битрейтом (ABR). Разница по битрейту оказалась несущественной, но время кодирования для AV1 и x264 возросло.</p><p>Оценка PSNR в ABR:</p><figure><img src="https://media.tproger.ru/uploads/2018/04/AV1_PSNR_ABR.jpg" alt="" /></figure><p>Оценка SSIM в ABR:</p><figure><img src="https://media.tproger.ru/uploads/2018/04/AV1_SSIM_ABR.jpg" alt="" /></figure><p>Скорость кодирования в ABR:</p><figure><img src="https://media.tproger.ru/uploads/2018/04/AV1_encoding_time_ratio_ABR.jpg" alt="" /></figure><p>Подробнее с результатами тестирования можно <a href="https://code.facebook.com/posts/253852078523394/av1-beats-x264-and-libvpx-vp9-in-practical-use-case/">ознакомиться</a> в блоге Facebook Code.</p><h3>Революция потокового видео</h3><p>Многие компании, включая Google, Twitch, Amazon и Microsoft, а также разработчики браузеров и производители чипов уже выражали заинтересованность в поддержке AV1 в своих продуктах. Видеокодек снизит планку входа на рынок потокового видео для стартапов и упростит его добавление в любые приложения, включая мессенджеры.</p><p>Напомним, что AV1 на основе <a href="https://en.wikipedia.org/wiki/VP9#Successor:_from_VP10_to_AV1">Google VP10</a>, <a href="https://en.wikipedia.org/wiki/Daala">Daala</a> и <a href="https://en.wikipedia.org/wiki/Thor_(video_codec)">Cisco Thor</a> <a href="https://tproger.ru/news/open-media-av1-codec-release/">выпущен</a> альянсом Open Media в конце марта 2018 года. Видеокодек поддерживает разрешение до 4К, а создатели отказались от взимания выплат за его использование.</p>]]></content:encoded>
    </item>
    <item>
      <title>Вышел свободный видеокодек AV1, поддерживающий разрешение до 4К</title>
      <link>https://tproger.ru/news/open-media-av1-codec-release</link>
      <comments>https://tproger.ru/news/open-media-av1-codec-release?scrollTo=tproger-comments</comments>
      <dc:creator><![CDATA[Рамис Ганиев]]></dc:creator>
      <guid isPermaLink="true">https://tproger.ru/news/open-media-av1-codec-release</guid>
      <description><![CDATA[<p>Альянс Open Media выпустил AV1 без отчислений: кодек с высоким сжатием поддерживает 4K-видео и кодирует его на 30 % эффективнее ряда аналогов.</p><p>— Читать дальше «<a rel="follow" href="https://tproger.ru/news/open-media-av1-codec-release">Вышел свободный видеокодек AV1, поддерживающий разрешение до 4К</a>»</p>]]></description>
      <category><![CDATA[Google]]></category>
      <category><![CDATA[Компьютерная графика]]></category>
      <category><![CDATA[Работа с кодировками]]></category>
      <category><![CDATA[Новости]]></category>
      <slash:comments>0</slash:comments>
      <pubDate>Thu, 29 Mar 2018 10:36:32 GMT</pubDate>
      <content:encoded><![CDATA[<p>Альянс Open Media объявил о релизе общедоступного видеокодека <a href="https://aomedia.org/av1-features/get-started/#specifcations">AOMedia Video Codec 1.0</a> (AV1), не требующего выплаты отчислений. Производители чипов уже могут интегрировать его поддержку в свои продукты и увеличить производительность устройств с любой пропускной способностью.</p><h3>Преимущества кодека</h3><p>B основе AV1 лежат технологии кодеков <a href="https://en.wikipedia.org/wiki/VP9#Successor:_from_VP10_to_AV1">Google VP10</a>, <a href="https://en.wikipedia.org/wiki/Daala">Daala</a> и <a href="https://en.wikipedia.org/wiki/Thor_(video_codec)">Cisco Thor</a>. Высокий уровень сжатия без потери качества позволяет организовывать онлайн-трансляции с разрешением выше 4096 × 3072 пикселей.</p><p>Исследование Bitmovin <a href="https://bitmovin.com/av1-multi-codec-dash-dataset/">показало</a>, что AV1 справляется с кодированием 4K-видео на 30 % эффективнее, чем AVC, VP9 и HEVC/H.265. Результат улучшается по мере увеличения качества: на высоких битрейтах преимущество перед VP9 достигает 27 %, а перед HEVC — 43 %.</p><figure><img src="https://media.tproger.ru/uploads/2018/03/0_1522251068.png" alt="" /></figure><h3>Цели альянса Open Media</h3><p>По данным <a href="https://www.cisco.com/c/en/us/solutions/collateral/service-provider/visual-networking-index-vni/complete-white-paper-c11-481360.html">Cisco Visual Networking Index</a>, к 2021 году 82 % интернет-трафика будет состоять из видео. Союз 12 компаний, среди которых Google, Microsoft и Apple, надеется, что новый кодек откроет доступ к 4K-контенту широкой публике.</p><p>Альянс пытается защитить AV1 от организаций, требующих выплаты отчислений. По условиям <a href="https://aomedia.org/license/patent-license/">лицензионного соглашения</a>, пользователи кодека получают право на бесплатное использование связанных с ним патентов. Им запрещено подавать друг на друга судебные иски. При таких условиях угроза для AV1 может исходить только со стороны патентных троллей, которые ничего не производят, а только владеют интеллектуальной собственностью.</p><p>В январе 2018 года <a href="https://tproger.ru/news/photo-format-from-google-and-mozilla-could-leave-jpeg-in-the-dust/">стало известно</a>, что технология сжатия AV1 также может стать новым форматом изображений. Указывалось, что компании начнут двигаться в этом направлении как раз после завершения работы над видеоконтентом.</p>]]></content:encoded>
    </item>
    <item>
      <title>Unicode: визуализация занятого пространства и объяснение тех аспектов, которые должен знать каждый программист</title>
      <link>https://tproger.ru/translations/unicode-intro</link>
      <comments>https://tproger.ru/translations/unicode-intro?scrollTo=tproger-comments</comments>
      <dc:creator><![CDATA[Тарас Сереванн]]></dc:creator>
      <guid isPermaLink="true">https://tproger.ru/translations/unicode-intro</guid>
      <description><![CDATA[<p>Unicode — сложный стандарт на тысячу страниц с внутренней структурой, кодовыми точками и поддержкой более чем 1100 языков.</p><p>— Читать дальше «<a rel="follow" href="https://tproger.ru/translations/unicode-intro">Unicode: визуализация занятого пространства и объяснение тех аспектов, которые должен знать каждый программист</a>»</p>]]></description>
      <category><![CDATA[Массивы и строки]]></category>
      <category><![CDATA[Работа с кодировками]]></category>
      <category><![CDATA[Unicode]]></category>
      <category><![CDATA[Переводы]]></category>
      <slash:comments>0</slash:comments>
      <pubDate>Sun, 12 Mar 2017 18:43:47 GMT</pubDate>
      <content:encoded><![CDATA[<p>Unicode — это слово вызывает страх и трепет в сердцах миллионов программистов по всему миру. Несмотря на то, что все мы пытаемся «поддерживать Unicode» в нашем софте, Unicode — это не просто использование wchar_t для строк, это стандарт из тысячи страниц и десятки дополнений к нему. Поэтому спустя 30 лет после появления Unicode многие программисты всё ещё понятия не имеют, что же это на самом деле такое.</p><h3>Разнообразие и сложность</h3><p>Как только вы начинаете изучать Unicode, сразу же становится понятно, что это “явление” намного сложнее, чем та же таблица ASCII, с которой вы уже можете быть знакомы. Дело не только в том, что Unicode содержит намного больше символов. Unicode имеет сложную внутреннюю структуру, фичи и набор разноцветных костылей, и это явно не те вещи, которые вы ожидаете от простой таблицы символов.</p><p>Но во многом именно благодаря этому Unicode поддерживает все или почти все системы письменности, которые существуют в мире: на сегодня этот стандарт поддерживает более чем 1100 языков. Но его задача не только в том, чтобы вместить все возможные языки, но и в том, чтобы позволить им сосуществовать в одном тексте — это делает задачу ещё сложнее.</p><p>Тем не менее, разбираться в особенностях Unicode всё-таки следует любому программисту: подумайте о миллионах людей, которые смогут использовать ваше ПО на своем родном языке.</p><h3>Кодовое пространство</h3><p>Начнем с основ. Базовые элементы — это символы, хотя правильнее будет всё же использовать термин «кодовые точки». Кодовые точки определяются по шестнадцатеричному номеру и префиксу «U+». Например, U+0041 это латинская буква «A», а U+03B8 — греческая «θ». Каждая кодовая точка также имеет собственное название и ещё несколько характеристик, указанных в <a href="http://www.unicode.org/reports/tr44/">базе данных символов</a> Unicode.</p><p>Множество всех возможных кодовых точек называется кодовым пространством. Кодовое пространство Unicode состоит из 1 114 112 кодовых точек. Но лишь 128 237 (12%) из них на самом деле являются занятыми: более чем достаточно места для роста. Юникод также резервирует 138 468 кодовых точек для «приватного использования», то есть для внутренних нужд различных приложений.</p><h3>Распределение кодового пространства</h3><p>Лучший способ что-то понять — использовать визуализацию. (Кстати, если вы хотите понять суть каких-нибудь алгоритмов, у нас есть для вас <a href="https://tproger.ru/digest/8-algorithm-visualizers/">подборка сервисов</a> с визуализацией алгоритмов.) Ниже представлена карта всего кодового пространства, каждый пиксель соответствует одной кодовой точке. Для удобства карта поделена на поля (маленькие квадраты) размером 16×16 = 256 кодовых точек. Каждое большое поле содержит 65 536 кодовых точек. Всего существует 17 больших полей.</p><figure><img src="https://media.tproger.ru/uploads/2017/03/codespace-map.png" alt="" /></figure><p>Белым цветом помечено незанятое пространство, синим — уже определенные символы, а зеленым — приватные кодовые точки. Красным цветом обозначены суррогатные точки, которые являются результатом особенностей кодирования в UTF-16, о них мы поговорим позже.</p><p>Первое большое поле называется «Базовое мультиязычное поле». Оно содержит почти все символы, которые используются в современных текстах, включая латинские буквы, кириллицу, греческий, китайский, японский, корейский и так далее. В своей первой версии Unicode состоял только из этого поля и был расширен лишь в 1996 году.</p><p>Второе поле содержит исторические и специальные символы, например, сумерийскую клинопись, египетские иероглифы и эмодзи. Третье поле содержит небольшое количество менее известных китайских символов. Остальные поля остаются пустыми, не считая небольшого количества редко используемых символов форматирования в 15 поле. Поля 16-17 целиком в приватном использовании.</p><h3>Языки, поддерживаемые Unicode</h3><p>Давайте сосредоточимся на первых трех полях, именно там происходит всё самое интересное:</p><figure><img src="https://media.tproger.ru/uploads/2017/03/script-map.png" alt="" /></figure><p>Эта цветная карта обозначает 135 различных языков юникода. Китайский (бирюзовый) и корейский (коричневый) занимают основную часть базового поля (левый большой квадрат). Для сравнения, все европейские, средневосточные и южноазиатские языки вместились в первую строку базового поля.</p><p>По частоте использования в реальном мире лидирует первое поле, исключением являются эмодзи — они завоевали наши сердца, находясь во втором поле.</p><h3>Кодировки</h3><p>Как вы узнали раньше, кодовые точки задаются номерами с U+0000 по U+10FFFF. Но как эти номера хранятся в реальной памяти компьютера? Использование первого, что приходит в голову — обычного 32-битного целочисленного типа — было бы очень ресурсоемким и не оправданным. Нам понадобилось бы по 4 байта на каждую кодовую точку. Поэтому тут на помощь нам приходят стандарты кодирования UTF — Unicode Transformation Format.</p><p>Некоторые программисты считают, что Unicode и UTF — это разные вещи, но на самом деле UTF-8, UTF-16 и UTF-32 являются лишь стандартами преобразования UTF, которые позволяют значительно сэкономить память и повысить скорость обработки.</p><p>Например, в UTF-8 символы с кодами меньше 128 представляются всего одним байтом, а так как в Юникоде они повторяют ASCII, то текст, написанный только этими символами, будет являться текстом в ASCII — это позволяет избежать лишних конвертаций. Символы же с кодами от 128 до 65536 кодируются 2-мя байтами, аналогично существуют 3-байтные и 4-байтные коды.</p><p>Смысл UTF-16 и UTF-32 в том, чтобы представить ещё большую часть Unicode как обычную таблицу, подобную ASCII. Например, UTF-32 — это и есть большая таблица ASCII для всего юникода, но в 99% случаев хватает и UTF-8.</p><h3>Комбинации знаков</h3><p>До этого мы обсуждали только кодовые точки, но в юникоде символ может быть больше, чем одной кодовой точкой. Комбинации созданы для экономии памяти: именно с их помощью ставятся ударения и другие крючочки под и над буквами.</p><p>Например, букву под ударением (Á) можно описать таким образом: U+0041 (A) + U+0301 (`).</p><p>Видели в интернете м̵͉̪̫̳̖͌͋͗͌̑̎а̬̜ͣͤг̘͎̹̜͕̤͊̊̽и͕̽͌ͮͬ͡ю͉͑̏ ̛̹̬̜̪̳̹̙̿̄͋̏т̹̫͚̱̩ͅи̼̬̤̓͒ͨ̅́́̚̚п̗̔̒ͧ̇ͩ̐̔а̺̄͆ͭ ̢̜͉̮̭͚ͬ͒͐̈̚т̛̦̖͎̪̭͇̓а̛͙̳̼̺̲̜̂ͮͦ̈́̃̈́ͣк̳̘̝̔́о͉̜̆̈́й͉͍̜͛͆́̀? Она создается именно с помощью комбинации знаков.</p><h3>И это только начало</h3><p>Эта статья содержит более 5 000 символов, но на самом деле является лишь верхушкой айсберга. Юникод полон других сложных вещей: чего стоят одни только применения (mapping), сопоставления (collation) и двунаправленный текст. Но и это далеко не всё.</p><p>Юникод — очень сложная система. И хотя для работы программистом вам не обязательно понимать её полностью, некоторые знаний всё-таки станут полезными на практике.</p><p>Если хотите узнать больше, то можете прочитать следующие материалы:</p><ul><li><a href="http://www.unicode.org/versions/latest/">Стандарт</a>;</li><li><a href="http://utf8everywhere.org/">Манифест «UTF-8 везде»</a>;</li><li><a href="https://eev.ee/blog/2015/09/12/dark-corners-of-unicode/">Темная сторона юникода</a>;</li><li><a href="https://www.google.com/get/noto/">Google Noto Fonts</a> — шрифты, покрывающие весь спектр Unicode.</li></ul><p>Но что вы точно обязаны сделать, так это поблагодарить юникод за то, что мы больше никогда не вернемся в старые времена несовместимых кодировок.</p><p>Спасибо, юникод.</p>]]></content:encoded>
    </item>
  </channel>
</rss>