Это статья о том, что помогает нам выводить буквы на экран почти во всех компьютерах и смартфонах мира. Чисто для кругозора и понимания мира информационных технологий.
7-битная кодировка: первая таблица символов
Так-то компьютеры понятия не имеют про буквы и цифры. Они знают только единицы и нули.
Чтобы компьютер мог вывести на экран буквы, цифры и другие символы, ему их нужно две вещи:
- Знать, как эти символы выглядят, — какие пиксели зажигать, какие нет.
- Знать, какой символ какому коду соответствует, — чтобы выводить нужные символы.
Когда компьютеры только появлялись, для решения этой задачи придумали таблицу символов: в ней хранились рисунки символов и их код. Компьютер получал команды «выведи символ номер такой-то», он находит такой-то номер, запоминал рисунок символа, выводил его на экран и повторял это быстро-быстро, чтобы символов на экране было много.
В 1960-х годах, когда персональные компьютеры только появляться в США, в таблицах была только латиница и математические символы. Ещё были управляющие коды — они сообщали компьютеру, что делать с данными дальше. Всего таких символов набралось 127, а такая таблица называлась ASCII (Американский стандарт представления информации):
Кодирование от Алкоголизма. Как происходит кодировка от алкоголя, как закодироваться
Каждый символ в этой таблице можно закодировать в семи битах (нолях и единицах), что в сумме давало 2⁷ = 128 символов:
000 0000 ← самый первый символ в таблице
111 1111 ← последний символ в таблице
Например, если считать с нуля, то заглавная буква A стоит на 65-м месте в таблице. Число 65 в десятичной системе — это 1000001 в двоичной, и это занимает как раз 7 бит.
Проблема этой таблицы в том, что с ней не получится закодировать русский текст — в таблице ASCII нет русских букв. И болгарский тоже не получится, как и китайский, арабский и прочие языки, где есть свои начертания букв.
8-битная кодировка: добавляются национальные символы
Чтобы компьютер мог выводить символы из других языков, семибитную таблицу кодировки расширили до восьмибитной. Это значит, что каждый символ в ней кодировался уже восемью битами, а в таблице могло поместиться 2⁸ = 256 символов.
В СССР такой восьмибитной таблицей стала КОИ-8 — в ней добавились символы русского алфавита и элементы псевдографики. В международном формате эта кодировка известна как KOI8-R. Для сохранения обратной совместимости первые 128 символов совпадают с кодировкой ASCII:
Хитрость этой кодировки в том, что если отбросить первый бит и превратить её в семибитную, то все почти все русские буквы превратятся в такие же латинские:
Ц →C и так далее
КАК РАБОТАЮТ КОДИРОВКИ | ОСНОВЫ ПРОГРАММИРОВАНИЯ
Это было сделано для сохранения максимальной совместимости текстов: если его открыть на компьютере, где нет КОИ-8, то текст всё равно получится прочитать, пусть и на латинице. Это прямо хардкорная обратная совместимость, но тогда это было необходимо: памяти было мало.
Проблема символьных языков
Восьмибитная кодировка решила проблему многих языков: дополнительные 128 ячеек позволили разместить много национальных букв алфавита. Но осталась проблема с другими языками, где дополнительных символов нужно гораздо больше, например:
- китайский,
- корейский,
- японский,
- тамильский,
- язык чероки,
- эфиопский.
В итоге каждая страна с такой письменностью делала свои таблицы кодировок. Это неудобно для всех, у кого нет таких таблиц: при открытии файла получался бессмысленный набор символов из той кодировки, что была под рукой.
Интернетные байки
В конце девяностых и начале двухтысячных в русскоязычном интернете была проблема с кодировками русских символов. В ходу было несколько восьмибитных кодировок: KOI-8R, Windows 1251 и ещё отдельная для MacOS. На главных страницах сайтов можно было прямо выбрать, в какой вам кодировке отобразить сайт. Не все браузеры поддерживали все эти кодировки, приходилось выкручиваться. Админы делали разные версии сайтов в разной кодировке — буквально клали на сервер разные файлы для разных кодировок.
По мере распространения компьютеров с Windows сайты стали делать в кодировке Win-1251, а потом все переползли на Юникод.
Юникод
Чтобы решить все проблемы с кодировками во всех странах, придумали Unicode — это сокращение от слов universal code (универсальный код). Идея в том, чтобы собрать все кодировки в одном месте — это позволит прочитать любой текст в любой стране, набранный на любом языке мира.
В Юникоде можно закодировать 1 112 064 символов — букв, знаков, иерогрифов, эмодзи, пиктограмм, глифов и других элементов письменности. Сейчас в Юникоде занято примерно 150 тысяч символов, но этого уже достаточно, чтобы охватить почти всю письменность мира. И, соответственно, ещё миллион символов ждёт, когда мы их придумаем.
Все современные операционные системы поддерживают Юникод, поэтому сейчас мы можем спокойно открыть любые файлы с китайскими иероглифами или арабской вязью.
Вот несколько примеров таблиц с разными символами Юникода. Числа под каждым символом — это порядковый номер символа в общей таблице.
Принципы Юникода
Гарантии стабильности — каждый символ всегда остаётся на своём месте. Даже если несколько лет спустя выяснится, что в таблицу забыли добавить важный для языка символ, он появится не рядом со своим языком, а на новой пустой позиции. Чтобы сгруппировать элементы языка в одном месте, используют национальные порядки сортировки, а не меняют записи в таблице. Это значит, что каждая новая версия Юникода полностью обратно совместима со всеми предыдущими.
Динамическая компоновка. Многие символы в Юникоде получаются соединением двух других, например A + ¨ = Ä. Есть исключения, но на общем фоне их немного.
Без оформления. Задача Юникода — передать смысл текста, а не его внешний вид. Это значит, что в кодировке нет правил оформления или выделения слов цветом.
Юникод кодирует простой текст без оформления. Считается, что простой текст должен хранить достаточно данных, чтобы читаемо отобразить его, и больше ничего.
Что не входит в Юникод
Кажется, что в Юникоде достаточно места, чтобы не фильтровать символы, а добавлять всё подряд. Но на деле есть свои ограничения:
- малоизвестная письменность, про которую пока мало данных;
- языки и письменности, где нет устоявшихся стандартов;
- нетекстовая письменность, например иератика и демотика — часть египетской клинописи (египетские иероглифы, кстати, в Юникоде есть).
Что дальше
В следующей части разберём, как символы Юникода кодируются и хранятся в виде наборов битов. Это не так просто, как кажется: нужно учесть технические ограничения при передаче данных и уметь переводить одни символы в другие.
Апскиллинг, как говорится
Апскиллинг — это, например, переход с уровня junior на уровень middle, а потом — senior. У «Яндекс Практикума» есть курсы ровно для этого: от алгоритмов и типов данных до модных фреймворков.
Получите ИТ-профессию
В «Яндекс Практикуме» можно стать разработчиком, тестировщиком, аналитиком и менеджером цифровых продуктов. Первая часть обучения всегда бесплатная, чтобы попробовать и найти то, что вам по душе. Дальше — программы трудоустройства.
Источник: thecode.media
Символы Unicode: о чём должен знать каждый разработчик
Если вы пишете международное приложение, использующее несколько языков, то вам нужно кое-что знать о кодировке. Она отвечает за то, как текст отображается на экране. Я вкратце расскажу об истории кодировки и о её стандартизации, а затем мы поговорим о её использовании. Затронем немного и теорию информатики.
Введение в кодировку
Компьютеры понимают лишь двоичные числа — нули и единицы, это их язык. Больше ничего. Одно число называется байтом, каждый байт состоит из восьми битов. То есть восемь нулей и единиц составляют один байт. Внутри компьютеров всё сводится к двоичности — языки программирования, движений мыши, нажатия клавиш и все слова на экране.
Но если статья, которую вы читаете, раньше была набором нулей и единиц, то как двоичные числа превратились в текст? Давайте разберёмся.
Краткая история кодировки
На заре своего развития интернет был исключительно англоязычным. Его авторам и пользователям не нужно было заботиться о символах других языков, и все нужды полностью покрывала кодировка American Standard Code for Information Interchange (ASCII).
ASCII — это таблица сопоставления бинарных обозначений знакам алфавита. Когда компьютер получает такую запись:
01001000 01100101 01101100 01101100 01101111 00100000 01110111 01101111 01110010 01101100 01100100
то с помощью ASCII он преобразует её во фразу «Hello world».
Один байт (восемь бит) был достаточно велик, чтобы вместить в себя любую англоязычную букву, как и управляющие символы, часть из которых использовалась телепринтерами, так что в те годы они были полезны (сегодня уже не особо). К управляющим символам относился, например 7 (0111 в двоичном представлении), который заставлял компьютер издавать сигнал; 8 (1000 в двоичном представлении) — выводил последний напечатанный символ; или 12 (1100 в двоичном представлении) — стирал весь написанный на видеотерминале текст.
В те времена компьютеры считали 8 бит за один байт (так было не всегда), так что проблем не возникало. Мы могли хранить все управляющие символы, все числа и англоязычные буквы, и даже ещё оставалось место, поскольку один байт может кодировать 255 символов, а для ASCII нужно только 127. То есть неиспользованными оставалось ещё 128 позиций в кодировке.
Вот как выглядит таблица ASCII. Двоичными числами кодируются все строчные и прописные буквы от A до Z и числа от 0 до 9. Первые 32 позиции отведены для непечатаемых управляющих символов.
Проблемы с ASCII
Позиции со 128 по 255 были пустыми. Общественность задумалась, чем их заполнить. Но у всех были разные идеи. Американский национальный институт стандартов (American National Standards Institute, ANSI) формулирует стандарты для разных отраслей. Там утвердили позиции ASCII с 0 по 127.
Их никто не оспаривал. Проблема была с остальными позициями.
Вот чем были заполнены позиции 128-255 в первых компьютерах IBM:
Какие-то загогулины, фоновые иконки, математические операторы и символы с диакретическим знаком вроде é. Но разработчики других компьютерных архитектур не поддержали инициативу. Всем хотелось внедрить свою собственную кодировку во второй половине ASCII.
Все эти различные концовки назвали кодовыми страницами.
Что такое кодовые страницы ASCII?
Здесь собрана коллекция из более чем 465 разных кодовых страниц! Существовали разные страницы даже в рамках какого-то одного языка, например, для греческого и китайского. Как можно было стандартизировать этот бардак? Или хотя бы заставить его работать между разными языками? Или между разными кодовыми страницами для одного языка? В языках, отличающихся от английского?
У китайцев больше 100 000 иероглифов. ASCII даже не может всех их вместить, даже если бы решили отдать все пустые позиции под китайские символы.
Эта проблема даже получила название Mojibake (бнопня, кракозябры). Так говорят про искажённый текст, который получается при использовании некорректной кодировки. В переводе с японского mojibake означает «преобразование символов».
Пример бнопни (кракозябров).
Безумие какое-то.
Именно! Не было ни единого шанса надёжно преобразовывать данные. Интернет — это лишь монструозное соединение компьютеров по всему миру. Представьте, что все страны решили использовать собственные стандарты. Например, греческие компьютеры принимают только греческий язык, а английские отправляют только английский.
Это как кричать в пустой пещере, тебя никто не услышит.
ASCII уже не удовлетворял жизненным требованиям. Для всемирного интернета нужно было создать что-то другое, либо пришлось бы иметь дело с сотнями кодовых страниц.
��� Если только ������ вы не хотели ��� бы ��� читать подобные параграфы. �֎֏0590��׀ׁׂ׃ׅׄ׆ׇ
Так появился Unicode
Unicode расшифровывают как Universal Coded Character Set (UCS), и у него есть официальное обозначение ISO/IEC 10646. Но обычно все используют название Unicode.
Этот стандарт помог решить проблемы, возникавшие из-за кодировки и кодовых страниц. Он содержит множество кодовых пунктов (кодовых точек), присвоенных символам из языков и культур со всего мира. То есть Unicode — это набор символов. С его помощью можно сопоставить некую абстракцию с буквой, на которую мы хотим ссылаться. И так сделано для каждого символа, даже египетских иероглифов.
Кто-то проделал огромную работу, сопоставляя каждый символ во всех языках с уникальными кодами. Вот как это выглядит:
«Hello World» U+0048 : латинская прописная H U+0065 : латинская строчная E U+006C : латинская строчная L U+006C : латинская строчная L U+006F : латинская строчная O U+0020 : пробел U+0057 : латинская прописная W U+006F : латинская строчная O U+0072 : латинская строчная R U+006C : латинская строчная L U+0064 : латинская строчная D
Префикс U+ говорит о том, что это стандарт Unicode, а число — это результат преобразования двоичных чисел. Стандарт использует шестнадцатеричную нотацию, которая является упрощённым представлением двоичных чисел. Здесь вы можете ввести в поле что угодно и посмотреть, как это будет преобразовано в Unicode. А здесь можно полюбоваться на все 143 859 кодовых пунктов.
Уточню на всякий случай: речь идёт о большом словаре кодовых пунктов, присвоенных всевозможным символам. Это очень большой набор символов, не более того.
Осталось добавить последний ингредиент.
Unicode Transform Protocol (UTF)
UTF — протокол кодирования кодовых пунктов в Unicode. Он прописан в стандарте и позволяет кодировать любой кодовый пункт. Однако существуют разные типы UTF. Они различаются количеством байтов, используемых для кодировки одного пункта. В UTF-8 используется один байт на пункт, в UTF-16 — два байта, в UTF-32 — четыре байта.
Но если у нас есть три разные кодировки, то как узнать, какая из них применяется в конкретном файле? Для этого используют маркер последовательности байтов (Byte Order Mark, BOM), который ещё называют сигнатурой кодировки (Encoding Signature). BOM — это двухбайтный маркер в начале файл, который говорит о том, какая именно кодировка тут применена.
В интернете чаще всего используют UTF-8, она также прописана как предпочтительная в стандарте HTML5, так что уделю ей больше всего внимания.
Этот график построен в 2012-м, UTF-8 становилась доминирующей кодировкой. И всё ещё ею является.
График показывает распространённость UTF-8.
Что такое UTF-8 и как она работает?
UTF-8 кодирует с помощью одного байта каждый кодовый пункт Unicode с 0 по 127 (как в ASCII). То есть если вы писали программу с использованием ASCII, а ваши пользователи применяют UTF-8, они не заметят ничего необычного. Всё будет работать как задумано. Обратите внимание, как это важно. Нам нужно было сохранить обратную совместимость с ASCII в ходе массового внедрения UTF-8.
И эта кодировка ничего не ломает.
Как следует из названия, кодовый пункт состоит из 8 битов (один байт). В Unicode есть символы, которые занимают несколько байтов (вплоть до 6). Это называют переменной длиной. В разных языках удельное количество байтов разное. В английском — 1, европейские языки (с латинским алфавитом), иврит и арабский представлены с помощью двух байтов на кодовый пункт.
Для китайского, японского, корейского и других азиатских языков используют по три байта.
Если нужно, чтобы символ занимал больше одного байта, то применяется битовая комбинация, обозначающая переход — он говорит о том, что символ продолжается в нескольких следующих байтах.
И теперь мы, как по волшебству, пришли к соглашению, как закодировать шумерскую клинопись (Хабр её не отображает), а также значки emoji!
Подытожив сказанное: сначала читаем BOM, чтобы определить версию кодировки, затем преобразуем файл в кодовые пункты Unicode, а потом выводим на экран символы из набора Unicode.
Напоследок про UTF
Коды являются ключами. Если я отправлю ошибочную кодировку, вы не сможете ничего прочесть. Не забывайте об этом при отправке и получении данных. В наших повседневных инструментах это часто абстрагировано, но нам, программистам, важно понимать, что происходит под капотом.
Как нам задавать кодировку? Поскольку HTML пишется на английском, и почти все кодировки прекрасно работают с английским, мы можем указать кодировку в начале раздела .
Важно сделать это в самом начале , поскольку парсинг HTML может начаться заново, если в данный момент используется неправильная кодировка. Также узнать версию кодировки можно из заголовка Content-Type HTTP-запроса/ответа.
Если HTML-документ не содержит упоминания кодировки, спецификация HTML5 предлагает такое интересное решение, как BOM-сниффинг. С его помощью мы по маркеру порядка байтов (BOM) можем определить используемую кодировку.
Это всё?
Unicode ещё не завершён. Как и в случае с любым стандартом, мы что-то добавляем, убираем, предлагаем новое. Никакие спецификации нельзя назвать «завершёнными». Обычно в год бывает 1-2 релиза, найти их описание можно здесь.
Если вы дочитали до конца, то вы молодцы. Предлагаю сделать домашнюю работу. Посмотрите, как могут ломаться сайты при использовании неправильной кодировки. Я воспользовался этим расширением для Google Chrome, поменял кодировку и попытался открывать разные страницы. Информация была совершенно нечитаемой. Попробуйте сами, как выглядит бнопня.
Это поможет понять, насколько важна кодировка.
Заключение
При написании этой статьи я узнал о Майкле Эверсоне. С 1993 года он предложил больше 200 изменений в Unicode, добавил в стандарт тысячи символов. По состоянию на 2003 год он считался самым продуктивным участником. Он один очень сильно повлиял на облик Unicode. Майкл — один из тех, кто сделал интернет таким, каким мы его сегодня знаем.
Очень впечатляет.
Надеюсь, мне удалось показать вам, для чего нужны кодировки, какие проблемы они решают, и что происходит при их сбоях.
- Блог компании VK
- Разработка веб-сайтов
- Проектирование и рефакторинг
- Терминология IT
- Хранение данных
Источник: habr.com
Декодер онлайн (decoder online)
Определить исходную кодировку При онлайн передаче электронных документов (почтовая рассылка, скачивание с сайта и т.д.) в файле может сбиться кодировка. В результате вместо привычных слов, предложений и абзацев вы получаете последовательность непонятных символов.
Так случается из-за того, что кодирование и декодирование информации происходит некорректно, и устройства отправителя и получателя просто не понимают друг друга. Чтобы расшифровать зашифрованный текст, обратитесь к нашему онлайн декодеру.
Decoder (дешифратор или декодер онлайн) от компании Involta способен подобрать нужную кодировку и изменить текст так, чтобы Вы смогли быстро прочитать непонятные «иероглифы». Наш инструмент имеет множество возможностей для декодирования. Он позволяет расшифровать base64 и определить исходные данные, а также перевести информацию в любую другую кодировку онлайн, например, UTF-8, CP-1251, ASCII.
Decoder может функционировать как шифратор и дешифратор, то есть вы можете закодировать текст и защитить его содержимое от посторонних глаз. Если вам прислали ссылку с непонятным адресом, то URL-decoder online покажет, на какой сайт она ведет. Еще одна полезная функция сервиса – создать или раскодировать транслит, если нужно сделать перевод с кириллицы на латиницу и наоборот. Декодер работает в режиме онлайн и доступен на любом устройстве с доступом в интернет.
Источник: involta.ru