Encoding speed что это

Intel Quick Sync Video

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

Encoding speed что это. Смотреть фото Encoding speed что это. Смотреть картинку Encoding speed что это. Картинка про Encoding speed что это. Фото Encoding speed что это

А этот скрин после аппаратного кодирования (кликабельно).

Encoding speed что это. Смотреть фото Encoding speed что это. Смотреть картинку Encoding speed что это. Картинка про Encoding speed что это. Фото Encoding speed что это

Encoding Settings > Performance: Software Only (Только ПО).

Encoding speed что это. Смотреть фото Encoding speed что это. Смотреть картинку Encoding speed что это. Картинка про Encoding speed что это. Фото Encoding speed что это

Encoding Settings > Performance: Hardware Accelerated (С аппаратным ускорением).

Encoding speed что это. Смотреть фото Encoding speed что это. Смотреть картинку Encoding speed что это. Картинка про Encoding speed что это. Фото Encoding speed что это

Характеристики видео после софтового рендеринга, утилита MediaInfo отображает следующие:

Encoding speed что это. Смотреть фото Encoding speed что это. Смотреть картинку Encoding speed что это. Картинка про Encoding speed что это. Фото Encoding speed что это

Характеристики видео после аппаратного рендеринга, утилита MediaInfo отображает следующие:

Encoding speed что это. Смотреть фото Encoding speed что это. Смотреть картинку Encoding speed что это. Картинка про Encoding speed что это. Фото Encoding speed что это

Encoding speed что это. Смотреть фото Encoding speed что это. Смотреть картинку Encoding speed что это. Картинка про Encoding speed что это. Фото Encoding speed что это

А здесь частота кадров выставлена 60fps. Юзер отметил, что именно изменение частоты кадров, может негативно влиять на качество.

Encoding speed что это. Смотреть фото Encoding speed что это. Смотреть картинку Encoding speed что это. Картинка про Encoding speed что это. Фото Encoding speed что это

Encoding speed что это. Смотреть фото Encoding speed что это. Смотреть картинку Encoding speed что это. Картинка про Encoding speed что это. Фото Encoding speed что это

Encoding speed что это. Смотреть фото Encoding speed что это. Смотреть картинку Encoding speed что это. Картинка про Encoding speed что это. Фото Encoding speed что это

— Rec2020 и HDR не будут аппаратно ускорены.
— 8K UHD не будет аппаратно ускорены.
— Профиль Main10 не будет аппаратно ускорен.
— Уровень 5.1 и ниже будет аппаратно ускорен. (Максимальный уровень/Level для H.264 это 6.2, а разрешение 8192х4320, если нужно больше, то снимаем галку соотношение сторон, выбираем профиль: Высокий и уровень: без ограничений).
— Экспорт только видео не будет ускорен аппаратно (должны быть оба потока: видео и аудио).
— Кодирование битрейта: «CBR» & «VBR, 2 pass» не будет аппаратно ускорено.
— Мультиплексор: None и 3GPP не будут аппаратно кодироваться.
— Аппаратные кодировки часто не соответствуют профилю и уровню, заданным в настройках экспорта, но должны попадать в допустимые диапазоны.

Источник

Разбираемся в Go: пакет encoding

Перевод одной из статей Бена Джонсона из серии «Go Walkthrough» по более углублённому изучению стандартной библиотеки Go в контексте реальных задач.

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

Этот пост является одним из серии статей по более углублённому разбору стандартной библиотеки. Несмотря на то, что стандартная документация предоставляет массу полезной информации, в контексте реальных задач может быть непросто разобраться, что и когда использовать. Эта серия статей направлена на то, чтобы показать использование пакетов стандартной библиотеки в контексте реальных приложений. Если у вас есть вопросы или комментарии, вы всегда можете написать мне в Твиттер — @benbjohnson.

Что такое кодирование (encoding)?

В программировании нередко для простых концепций используются замудрёные слова. Даже больше того — часто для одной концепции существует несколько замудрёных слов. Кодирование (encoding) это одно из таких слов. Иногда оно называется сериализацией(serialization) или маршалинг (marshaling) — что означет одно и тоже: добавление логической структуры сырым байтам.

В стандартной библиотеке Go мы используем термины кодирование (encoding) и маршалинг (marshaling) для двух разных, но связанных идей. Encoder в Go это объект, который добавляет логическую структуру на поток байт, в то время как marshaling работает с ограниченным набором байт в памяти.

Например, в пакете encoding/json есть json.Encoder и json.Decoder для работы с io.Writer и io.Reader потоками соответственно. И также в этом пакете мы видим json.Marshaler и json.Unmarshaler для записи и чтения байт из слайса.

Два типа кодирования

Есть ещё одно важно различие в кодировании. Некоторые пакеты для кодирования оперируют с примитивами — строки, целые числа и т.д. Строки закодированы кодировками вроде ASCII или Unicode или любыми другими кодировками. Целые числа могут закодированы по разному, в зависимости от endianness или используя целочисленное кодирование с произвольной длиной. Даже сами байты часто могут закодированы используя схемы вроде Base64, чтобы превратить их в печатаемые символы.

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

Делая компромиссы

Конвертация логической структуры в байты может поначалу показаться простой задачей — эти структуры ведь и так уже есть в памяти в виде байт. Почему просто его не использовать?

Есть много причин, почему формат байт в памяти не подходит для сохранения на диск или отправки в сеть. Во-первых, совместимость. Формат размещения байт в памяти Go объектов не совпадает с форматом объектов в Java, поэтому двум системам, написанным на разных языках, будет невозможно друг друга понимать. Также иногда нам нужна совместимость не только с другим языком программирования, но и с человеком. CSV, JSON и XML — это всё примеры человекочитаемых форматов, которые можно легко просмотреть и изменить вручную.

Впрочем, добавление человекочитаемости формату ставит нас перед компромиссом. Форматы, которые легко читаемы человеком, сложнее и дольше для чтения компьютером. Целые числа — хороший тому пример. Люди читают номера в десятичной форме, тогда как компьютер оперирует числами в двоичной форме. Люди также читают числа различной длины, вроде 1 или 1000, в то время, как компьютеры работают с числами фиксированного размера — 32 или 64 бит. Разница в производительности может показаться незначительной, но она быстро станет заметна при парсинге миллионов или миллирадов чисел.

Также есть один компромисс, о котором мы обычно не думаем поначалу. Наши структуры данных могут меняться со временем, но мы должны уметь работать с данными, закодированными много лет назад. Некоторые кодировки, вроде Protocol Buffers, позволяют описать схему для ваших данных и добавить версию к полям — старые поля могут быть объявлены устаревшими и добавлены новые. Минус тут в том, что нужно знать определение схемы вместе с данными, чтобы мочь закодировать или декодировать данные. Собственный формат Go — gob, использует другой подход и сохраняет схему данных прямо во время кодирования. Но тут минус в том, что размер закодированных данных становится довольно большим.

Некоторые форматы вообще обходят этот момент и идут без схемы. JSON и MessagePack позволяют кодировать структуры на лету, но не предоставляют никаких гарантий для безопасного декодирования со старых версий.

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

В конце концов, если вам важнее всего скорость, вы можете использовать внутренний формат памяти Go и сохранять данные как есть. Я даже написал для этого библиотеку под названием raw. Время кодирования и декодирования тут буквально 0 секунд. Но лучше не стоит её использовать в продакшене.

4 интерфейса в encoding

Если вы являетесь одним из тех немногих людей, которые заглядывали в пакет encoding, вы можете быть слегка разочарованы. Это второй самый маленький пакет после errors и в нём находятся всего лишь 4 интерфейса.

Они предназначены для объектов, которые предоставляют способ конвертировать в и из бинарного формата. Эти интерфейсы используются в нескольких местах в стандартной библиотеке, например в time.Time.MarshalBinary(). Вы не найдёте их много где, потому что обычно нет единого способа конвертировать данные в бинарную форму. Как мы уже увидели, есть огромное количество различных форматов сериализации.

Но на уровне приложения, вы скорее всего выберете какой-то один формат для кодирования. Например, вы можете выбрать Protocol Buffers для всех данных. Обычно нет смысла поддерживать сразу несколько бинарных форматов в приложении, поэтому реализация BinaryMarshaler может иметь смысл.

Следующие два интерфейса это TextMarshaler и TextUnmarshaler:

Эти два интерфейса очень похожи на предыдущие, но они работают с данными в формате UTF-8.

Некоторые форматы определяют свои собственные интерфейсы для маршалинга, например json.Marshaler, и они следуют той же логике имён.

Обзор пакетов encoding

В стандартной библиотеке есть множество полезных пакетов для кодирования данных. Мы рассмотрим их более детально в следующих статьях, но тут я бы хотел сделать краткий обзор. Некоторые из пакетов лежат в encoding/, а некоторые находятся в других местах.

Кодировки базовых типов

Скорее всего, первый пакет, который вы использовали, когда только познакомились с Go был пакет fmt (произносится «fumpt»). Он используется printf() формат в стиле C для кодирования и декодирования чисел, строк, байт и даже имеет базовые возможности по кодированию объектов. Пакет fmt это отличный и простой способ создавать человеко-читаемые строки на основании шаблонов, но парсинг шаблонов может быть не сильно быстрым.

Если вам нужна более высокая производительность, вы можете уйти от printf-шаблонов и использовать пакет strconv. Это низкоуровневый пакет для базового форматирования и сканирования строк, целых и дробных чисел, логических значений, и в целом он достаточно быстрый.

Эти пакеты, как и сам Go, подразумевают, что вы работаете со строками в UTF-8. Почти полное отсутствие поддержки не-Unicode кодировок в стандартной библиотеке скорее всего объясняется тем, что интернет в последние годы очень быстро сошёлся в том, что всё должно быть в UTF-8, а возможно и потому, что Роб Пайк как раз придумал и Go, и UTF-8, кто знает. Мне, наверное, повезло и не пришлось сталкиваться с не-UTF-8 кодировками в Go, но, впрочем, есть такие пакеты как unicode/utf16, encoding/ascii85 и целая ветка golang.org/x/text. Эта ветка содержит большое количество отличных пакетов, которые являются частью проекта Go, но не попадают под гарантии обратной совместимости Go 1.

Для кодирования чисел, пакет encoding/binary предоставляет big endian и little endian кодирование, а также кодирование чисел переменной длины. Endianness — означает порядок, в котором байты идут один за другм. Например uint16 представление числа 1000 (0x03e8 в шестнадцатеричной форме) состоит из двух байт — 03 и e8. В big endian форме эти байты пишутся в таком порядке — «03 e8». В little endian, порядок обратный — «e8 03». Многие популярные архитектуры CPU являются little endian. Но big endian обычно используется для отправки данных по сети. Он даже так и называется — network byte order.

В заключение, есть пару пакетов для непосредственного кодирования самих байт. Обычно кодирование байт используется для перевода их в печатаемый формат. Например, пакет encoding/hex используется для представления данных в шестнадцатеричной форме. Я лично его использовал только для отладочных целей. С другой стороны, иногда вам нужны печатаемые символы, потому что вы хотите отправить данные по протоколам, в которых, по историческим причинам, ограниченная поддержка бинарных данных (email, например). Пакеты encoding/base32 и encoding/base64 являюется хорошими примерами. Ещё один пример — пакет encoding/pem, который используется для кодирования TLS сертификатов.

Кодирование объектов

Для кодирования объектов в стандартной библиотеке чуть меньше пакетов. Но, на практике, этих пакетов оказывается более, чем достаточно.

Если вы только не провели последние 10 лет в танке, то наверняка заметили, что JSON стал форматом для кодирования объектов по умолчанию. Как уже упоминалось ранее, у JSON есть свои недостатки, но его очень просто использовать и его реализация есть почти во всех языках, поэтому и огромная популярность. Пакет encoding/json предоставляет отличную поддержку этого формата, и, также, в Go есть сторонние, более быстрые, реализации парсеров, такие как ffjson.

И хотя JSON стал доминирующим протоколом обмена между машинами, формат CSV всё еще остается популярным для экспорта данных для людей. Пакет encoding/csv предоставляет хороший интерфейс для работы с табличными данными в этом формате.

Если вы работете с системами, написанными в районе 2000-х, наверняка вам понадобится работать с XML. Пакет encoding/xml предоставляет интерфейс в SAX-стиле для дополнительного основанного на тэгах кодирования/декодирования, похожий на аналогичный пакет для json. Если вам нужны более сложные манипуляции и штуки вроде DOM, XPath, XSD и XSLT, тогда вам, наверное нужно использовать libxml2 через cgo.

У Go также есть свой собственный формат для потокового кодирования — gob. Этот пакет используется в net/rpc для реализации удаленного вызова процедур между Go сервисами. Gob прост в использовании, но он не поддерживается в других языках. gRPC выглядит как более популярная альтернатива если вам нужен кросс-языковой инструмент.

И в заключение, есть пакет encoding/asn1. Документация по нему скромная и единственная ссылка ведёт на 25 страничную стену текста — введение для новичков в ASN.1. ASN.1 это сложная схема кодировки, которая используется, в основном X.509 сертификами в SSL/TLS.

Заключение

Кодирование даёт фундамент для придания логической структуры сырым байтам. Без него у нас бы не было ни строк, ни стркутур данных, ни баз данных или хоть сколько нибудь полезных приложений. То, что кажется простой концепцией, на самом деле имеет богатую историю реализаций и огромный набор компромиссов.

В этой статье мы рассмотрели различные реализации кодировок, реализованных в стандартной библиотеке и некоторых их компромиссы. Мы увидели, как эти пакеты для работы с базовыми типами и объектами построены на нашем понимании работы с байтами и потоками байт в Go. В следующих статьях мы заглянем глубже в эти пакеты и посмотрим, как их использовать в контексте реальных приложений.

Источник

Что нужно знать каждому разработчику о кодировках и наборах символов для работы с текстом

Это первая часть перевода статьи What Every Programmer Absolutely, Positively Needs To Know About Encodings And Character Sets To Work With Text

Если вы работаете с текстом в компьютере, вам обязательно нужно знать про кодировки. Даже если вы посылаете электронные письма. Даже если вы их только получаете. Необязательно понимать каждую деталь, но надо хотя бы знать, что из себя представляют кодировки. И вот первая хорошая новость: статья может быть немного запутанной, но основная идея очень и очень простая.

Эта статья о кодировках и наборах символов.

Статья Джоеэля Спольски под названием «Абсолютный минимум о Unicode и наборе символов для каждого разработчика(без исключений!)» будет хорошей вводной и мне доставляет большое удовольствие перечитывать ее время от времени. Я стесняюсь отсылать к ней тех людей, которые испытывают трудности с пониманием проблем с кодировкам, хотя она довольно легкая в плане технических деталей. Я надеюсь, эта статья прольет немного света на то, чем именно являются кодировки, и почему все ваши тексты оказываются испорченными в самый ненужный момент. Статья предназначена для разработчиков(главным образом, на PHP), но пользу от нее может получить любой пользователь компьютера.

Основы

Все более или менее слышали об этом, но каким-то образом знание испаряется, когда дело доходит до обсуждения, так что вот вам: компьютер не может хранить буквы, числа, картинки или что-либо еще. Он может запомнить только биты. Бит имеет только два значения: ДА или НЕТ, ПРАВДА или ЛОЖЬ, 1 или 0 или любую другую пару, которую вы можете вообразить. Раз уж компьютер работает с электричеством, бит представлен электрическим зарядом: он либо есть, либо его нет. Людям проще представлять это в виде 1 и 0, так что я буду придерживаться этих обозначений.

Чтобы с помощью битов представлять нечно полезное, нам нужны правила. Надо сконвертировать последовательность бит в что-то похожее на буквы, числа и изображения, используя схему кодирования, или, коротко, кодировку. Вот так, например:

01100010 01101001 01110100 01110011
b i t s

В этой кодировке, 01100010 представляет из себя ‘b’, 01101001 — ‘i’, 01110100 — ‘t’, 01110011 — ‘s’. Конкретная последовательность бит соответствует букве, а буква – конкретной последовательности битов. Если вы можете запомнить последовательности для 26 букв или умеете действительно быстро находить нужное соответствие, то вы сможете читать биты, как книги.
Упомянутая схема носит название ASCII. Строка с нолями и единицами разбивается на части по 8 бит(по байтам). Кодировка ASCII определяет таблицу перевода байтов в человеческие буквы. Вот небольшой кусочек этой таблицы:

01000001 A
01000010 B
01000011 C
01000100 D
01000101 E
01000110 F

В ней 95 символов, включая буквы от A до Z, в нижнем и верхнем регистре, цифры от 0 до 9, с десяток знаков препинания, амперсанд, знак доллара и прочие. В нее также включены 33 значения, такие как пробел, табуляция, перевод строки, возврат символа и прочие. Это непечатаемые символы, хотя они видимы человеку и используются им. Некоторые значения полезны только компьютеру, такие как коды начала и конца текста. Всего в кодировку ASCII включены 128 символов — прекрасное ровное число для тех, кто смыслит в компьютерах, так как оно использует все комбинации 7ми битов (от 0000000 до 1111111).

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

01001000 01100101 01101100 01101100 01101111 00100000
01010111 01101111 01110010 01101100 01100100

Важные термины

Для кодирования чего-либо в ASCII двигайтесь справа налево, подменяя буквы на биты. Для декодирования битов в символы, следуйте по таблице слева направо, подменяя биты на буквы.

encode |enˈkōd|
verb [ with obj. ]
convert into a coded form
code |kōd|
noun
a system of words, letters, figures, or other symbols substituted for other words, letters, etc.

Кодирование – это представление чего-либо чем-нибудь другим. Кодировка – это набор правил, описывающий способ перевода одного представления в другое.

Прочие термины, заслуживающие прояснения:

Набор символов, чарсет, charset – Набор символов, который может быть закодирован. «Кодировка ASCII включает набор из 128 символов». Синоним к кодировке.

Кодовая страница – страница кодов, закрепляюшая за символом набор битов. Таблица. Синоним к кодировке.

Строка – пачка чего-нибудь, объединенных вместе. Битовая строка – это пачка бит, такая как 00011011. Символьная строка – это пачка символов, например «Вот эта». Синоним к последовательности.

Двоичный, восьмеричный, десятичный, шестнадцатеричный

Существует множество способов записывать числа. 10011111 – это бинарная запись для 237 в восьмеричной, 159 в десятичной и 9F в шестнадцатиричной системах. Значения у всех этих чисел одинаково, но шестнадцатиричная система короче и проще для понимания, чем двоичная. Я буду придерживаться двоичной системы в этой статье, чтобы улучшить понимание и убрать лишний уровень абстракции. Не пугайтесь, встречая коды символов в других нотациях, все значения эквиваленты.

Excusez-Moi?

Раз уж мы теперь знаем, о чем говорим, заметим: 95 символов – это совсем немного, когда речь идет о языках. Этот набор покрывает базовый английский, но как насчет французских символов? А вот это Straßen¬übergangs¬änderungs¬gesetz из немецкого языка? А приглашение на smörgåsbord в шведском? В-общем, не получится. Не в ASCII. Спецификация на представление é, ß, ü, ä, ö просто отсутствует.

“Постойте-ка”, скажут европейцы, “в обычных компьютерах с 8 битами в байте, ASCII никак не использует бит, который всегда равен 0! Мы можем использовать его, чтобы расширить таблицу еще на 128 значений”. И было так. Но способов обозначить звучание гласных еще слишком много. Не все сочетания букв и значений, используемые в европейских языках, влезают в таблицу из 256 записей. Так мир пришел к изобилию кодировок, стандартов, стандартов де-факто и недостандартов, которые покрывают все субнаборы символов. Кому-то понадобилось написать документ на шведском или чешском, и, не найдя нужной кодировки, просто изобрел еще одну. Или я думаю, что все так и произошло.

Не забывайте о русском, хинди, арабском, корейском и множестве других живых языков планеты. Про мертвые уж молчим. Как только вы найдете способ писать документ, использующий несколько языков, попробуйте добавить китайский. Или японский. Оба содержат тысячи символов. И у вас всего 256 значений. Вперед!

Многобайтные кодировки

Для создания таблиц, которые содержат более 256 символов, одного байта просто недостаточно. Двух байтов (16 бит) хватит для кодировки 65536 различных значений. Big-5 например, кодировка двухбайтная. Вместо разбиения последовательности битов в блоки по 8, она использует блоки по 16 битов и содержит большую(я имею ввиду БОЛЬШУЮ) таблицу с соответствием. Big-5 в своем основном виде покрывает большинство символов традиционного китайского. GB18030 – это похожая кодировка, но она включает как традиционный, так и упрощенный китайский. И, прежде чем вы спросите, да, есть кодировки только для упрощенного китайского. А разве одной недостаточно?

Вот кусок таблицы GB18030:

bits character
10000001 01000000 丂
10000001 01000001 丄
10000001 01000010 丅
10000001 01000011 丆
10000001 01000100 丏

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

Путаница с Unicode

В итоге тем, кому больше всех надоела эта каша, пришла в голову идея разработать единый стандарт, объединяющий все кодировки. Этим стандартом стал Unicode. Он определяет невероятную таблицу из 1 114 112 пунктов, используемую для всех вариантов букв и символов. Этого хватит для кодирования всех европейских, средне-азиатских, дальневосточных, южных, северных, западных, доисторических и будущих символов, о которых человечеству известно. Unicode позволяет создать документ на любом языке любыми символами, которые можно ввести в компьютер. Это было невозможно, или очень затруднительно до эры Unicode. В стандарте есть даже неофициальная секция под клингонский. Вы поняли, Unicode настолько большой, чтобы допускает неофициальные секции.

Итак, и сколько же байт использует Unicode для кодирования? Нисколько. Потому что Unicode – это не кодировка.
Смущены? Не вы одни. Unicode в первую и главную очередь определяет таблицу пунктов для символов. Это такой способ сказать «65 – A, 66 – B, 9731 – »(я не шучу, так и есть). Как эти пункты кодируются в байты является предметом другого разговора. Для представления 1 114 112 значений двух байт недостаточно. Трех достаточно, но 3 – странное число, так что 4 является комфортным минимумом. Но, пока вы не используете китайский, или другой язык со множеством символов, которые требуют большого количества битов для кодирования, вам никогда не придет в голову использовать толстую колбасу из 4х байт. Если “A” всегда кодируется в 00000000 00000000 00000000 01000001, а “B” – в 00000000 00000000 00000000 01000010, то документ, использующий такую кодировку, распухнет в 4 раза.

Существует несколько способов решения этой проблемы. UTF-32 – это кодировка, которая переводит все символы в наборы из 32 бит. Это простой алгоритм, но изводящий много места впустую. UTF-16 и UTF-8 являются кодировками с переменной длиной кодирования. Если символ может быть закодирован одним байтом(потому что номер пункта символа очень маленький), UTF-8 закодирует его одним байтом. Если нужно 2 байта, то используется 2 байта. Кодировка сообщает старшими битами, сколькими битами кодируется текущий символ. Такой способ экономит место, но так же и тратит его в случае, если эти сигнальные биты часто используются. UTF-16 является компромиссом: все символы как минимум двухбайтные, но их размер может увеличиваться до 4 байт, если нужно.

character encoding bits
A UTF-8 01000001
A UTF-16 00000000 01000001
A UTF-32 00000000 00000000 00000000 01000001
あ UTF-8 11100011 10000001 10000010
あ UTF-16 00110000 01000010
あ UTF-32 00000000 00000000 00110000 01000010

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

Пункты

Символы определяются по их Unicode-пунктам. Эти пункты записаны в шестнадцатеричной системе и предварены “ U+” (просто для удобство, не значит ничего, кроме “Это пункт Unicode”). Символ Ḁ имеет пункт U+1E00. Иными(десятичными) словами, это 7680й символ таблицы Unicode. Он официально называется “ЛАТИНСКАЯ ЗАГЛАВНАЯ БУКВА А С КОЛЬЦОМ СНИЗУ”.

Ниасилил

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

11000100 01000010 Windows Latin 1 ÄB
11000100 01000010 Mac Roman ƒB
11000100 01000010 GB18030 腂

characters encoding bits

Føö Windows Latin 1 01000110 11111000 11110110
Føö Mac Roman 01000110 10111111 10011010
Føö UTF-8 01000110 11000011 10111000 11000011 10110110

Заблуждения, смущения и проблемы

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

Какого черта мой текст нечитаем?

Если вы откроете документ, и он выглядит так, как текст выше, то причина у этого одна: ваша программа ошиблась с кодировкой. И все. Документ не испорчен(по крайней мере, пока), и не нужно никакое волшебство. Вместо него надо просто выбрать правильную кодировку для отображения текста. Предполагаемый документ выше содержит биты:

10000011 01000111 10000011 10010011 10000011 01010010 10000001 01011011
10000011 01100110 10000011 01000010 10000011 10010011 10000011 01001111
10000010 11001101 10010011 11101111 10000010 10110101 10000010 10101101
10000010 11001000 10000010 10100010

Так, быстренько угадали кодировку? Если вы пожали плечами, то вы правы. Да кто знает?
Попробуем с ASCII. Большая часть этих байтов начинается с 1. Если вы правильно помните, ASCII вообще-то не использует этот бит. Так что ASCII не вариант. Как насчет UTF-8? Большая часть байт не является валидными значениями в этой кодировке. Как насчет Mac Roman(еще одна европейская кодировка)? Хм, для нее эти байты являются правильными значениями. 10000011 декодируетися в ”É”, в “G” и так далее. Так что в Mac Roman текст будет выглядеть так: ÉGÉìÉRÅ[ÉfÉBÉìÉOÇÕìÔǵÇ≠ǻǢ. Правильно? Нет? Может быть? А компьютер-то откуда знает? Может кто-то хотел написать именно это. Насколько я знаю, это может быть последовательностью ДНК! Так и порешим: это Mac Roman, и это ДНК.

Конечно, это полный бред. Правильный ответ таков: текст закодирован в Japanes Shift-JIS и должен выглядеть как エンコーディングは難しくない. Кто бы мог подумать?
Первая причина нечитаемости текста в том, что кто-то пытается прочитать последовательность байт в неверной кодировке. Компьютеру всегда нужно подсказывать. Сам он не догадается. Некоторые типы документов определяют кодировку своего содержимого, но последовательность байт всегда остается черным ящиком.
Большинство браузеров предоставляют возможность указать кодировку страницы с помощью специального пункта меню. Иные программы тоже имеют аналогичные пункты.

У автора нет разбиения на части, но статья и так длинна. Продолжение будет через пару дней.

Источник

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *