Skip to content

Instantly share code, notes, and snippets.

Created August 30, 2017 17:53
Show Gist options
  • Save anonymous/eead7c50aa4af199a226e3ee107da116 to your computer and use it in GitHub Desktop.
Save anonymous/eead7c50aa4af199a226e3ee107da116 to your computer and use it in GitHub Desktop.
Сколько байтов в букве

Сколько байтов в букве


Сколько байтов в букве



Кодирование символов. Байт
Сколько бит информации несёт каждая буква русского алфавита?
Информационный объем текста и единицы измерения информации


























Только полноправные пользователи могут оставлять комментарии. TM Feed Хабрахабр Geektimes Тостер Мой круг Фрилансим. Хабрахабр Публикации Пользователи Хабы Компании Песочница. Это первая часть перевода статьи What Every Programmer Absolutely, Positively Needs To Know About Encodings And Character Sets To Work With Text Если вы работаете с текстом в компьютере, вам обязательно нужно знать про кодировки. Даже если вы посылаете электронные письма. Даже если вы их только получаете. Необязательно понимать каждую деталь, но надо хотя бы знать, что из себя представляют кодировки. И вот первая хорошая новость: Эта статья о кодировках и наборах символов. Я стесняюсь отсылать к ней тех людей, которые испытывают трудности с пониманием проблем с кодировкам, хотя она довольно легкая в плане технических деталей. Я надеюсь, эта статья прольет немного света на то, чем именно являются кодировки, и почему все ваши тексты оказываются испорченными в самый ненужный момент. Статья предназначена для разработчиков главным образом, на PHP , но пользу от нее может получить любой пользователь компьютера. Основы Все более или менее слышали об этом, но каким-то образом знание испаряется, когда дело доходит до обсуждения, так что вот вам: Он может запомнить только биты. Бит имеет только два значения: ДА или НЕТ, ПРАВДА или ЛОЖЬ, 1 или 0 или любую другую пару, которую вы можете вообразить. Раз уж компьютер работает с электричеством, бит представлен электрическим зарядом: Людям проще представлять это в виде 1 и 0, так что я буду придерживаться этих обозначений. Чтобы с помощью битов представлять нечно полезное, нам нужны правила. Надо сконвертировать последовательность бит в что-то похожее на буквы, числа и изображения, используя схему кодирования, или, коротко, кодировку. Конкретная последовательность бит соответствует букве, а буква — конкретной последовательности битов. Если вы можете запомнить последовательности для 26 букв или умеете действительно быстро находить нужное соответствие, то вы сможете читать биты, как книги. Упомянутая схема носит название ASCII. Строка с нолями и единицами разбивается на части по 8 бит по байтам. Кодировка ASCII определяет таблицу перевода байтов в человеческие буквы. Вот небольшой кусочек этой таблицы: В нее также включены 33 значения, такие как пробел, табуляция, перевод строки, возврат символа и прочие. Это непечатаемые символы, хотя они видимы человеку и используются им. Некоторые значения полезны только компьютеру, такие как коды начала и конца текста. Всего в кодировку ASCII включены символов — прекрасное ровное число для тех, кто смыслит в компьютерах, так как оно использует все комбинации 7ми битов от до Вот вам способ представить человеческую строку, используя только единицы и нули: Для декодирования битов в символы, следуйте по таблице слева направо, подменяя биты на буквы. Кодирование — это представление чего-либо чем-нибудь другим. Кодировка — это набор правил, описывающий способ перевода одного представления в другое. Прочие термины, заслуживающие прояснения: Набор символов, чарсет, charset — Набор символов, который может быть закодирован. Кодовая страница — страница кодов, закрепляюшая за символом набор битов. Строка — пачка чего-нибудь, объединенных вместе. Битовая строка — это пачка бит, такая как Двоичный, восьмеричный, десятичный, шестнадцатеричный Существует множество способов записывать числа. Значения у всех этих чисел одинаково, но шестнадцатиричная система короче и проще для понимания, чем двоичная. Я буду придерживаться двоичной системы в этой статье, чтобы улучшить понимание и убрать лишний уровень абстракции. Не пугайтесь, встречая коды символов в других нотациях, все значения эквиваленты. Раз уж мы теперь знаем, о чем говорим, заметим: Этот набор покрывает базовый английский, но как насчет французских символов? Но способов обозначить звучание гласных еще слишком много. Не все сочетания букв и значений, используемые в европейских языках, влезают в таблицу из записей. Так мир пришел к изобилию кодировок, стандартов, стандартов де-факто и недостандартов, которые покрывают все субнаборы символов. Кому-то понадобилось написать документ на шведском или чешском, и, не найдя нужной кодировки, просто изобрел еще одну. Или я думаю, что все так и произошло. Не забывайте о русском, хинди, арабском, корейском и множестве других живых языков планеты. Про мертвые уж молчим. Как только вы найдете способ писать документ, использующий несколько языков, попробуйте добавить китайский. Оба содержат тысячи символов. И у вас всего значений. Многобайтные кодировки Для создания таблиц, которые содержат более символов, одного байта просто недостаточно. Двух байтов 16 бит хватит для кодировки различных значений. Big-5 например, кодировка двухбайтная. Вместо разбиения последовательности битов в блоки по 8, она использует блоки по 16 битов и содержит большую я имею ввиду БОЛЬШУЮ таблицу с соответствием. Big-5 в своем основном виде покрывает большинство символов традиционного китайского. GB — это похожая кодировка, но она включает как традиционный, так и упрощенный китайский. И, прежде чем вы спросите, да, есть кодировки только для упрощенного китайского. А разве одной недостаточно? Вот кусок таблицы GB Путаница с Unicode В итоге тем, кому больше всех надоела эта каша, пришла в голову идея разработать единый стандарт, объединяющий все кодировки. Этим стандартом стал Unicode. Он определяет невероятную таблицу из 1 пунктов, используемую для всех вариантов букв и символов. Этого хватит для кодирования всех европейских, средне-азиатских, дальневосточных, южных, северных, западных, доисторических и будущих символов, о которых человечеству известно. Unicode позволяет создать документ на любом языке любыми символами, которые можно ввести в компьютер. Это было невозможно, или очень затруднительно до эры Unicode. В стандарте есть даже неофициальная секция под клингонский. Вы поняли, Unicode настолько большой, чтобы допускает неофициальные секции. Итак, и сколько же байт использует Unicode для кодирования? Потому что Unicode — это не кодировка. Unicode в первую и главную очередь определяет таблицу пунктов для символов. Как эти пункты кодируются в байты является предметом другого разговора. Для представления 1 значений двух байт недостаточно. Трех достаточно, но 3 — странное число, так что 4 является комфортным минимумом. Но, пока вы не используете китайский, или другой язык со множеством символов, которые требуют большого количества битов для кодирования, вам никогда не придет в голову использовать толстую колбасу из 4х байт. Существует несколько способов решения этой проблемы. UTF — это кодировка, которая переводит все символы в наборы из 32 бит. Это простой алгоритм, но изводящий много места впустую. UTF и UTF-8 являются кодировками с переменной длиной кодирования. Если символ может быть закодирован одним байтом потому что номер пункта символа очень маленький , UTF-8 закодирует его одним байтом. Если нужно 2 байта, то используется 2 байта. Кодировка сообщает старшими битами, сколькими битами кодируется текущий символ. Такой способ экономит место, но так же и тратит его в случае, если эти сигнальные биты часто используются. Unicode — это огромная таблица соответствия символов и чисел, а различные UTF кодировки определяют, как эти числа переводятся в биты. В-общем, Unicode — это просто еще одна схема. Ничего особенного, она просто пытается покрыть все, что можно, оставаясь эффективной. Пункты Символы определяются по их Unicode-пунктам. Иными десятичными словами, это й символ таблицы Unicode. Причина в том, что разные кодировки используют разное число бит на символ и разные значения для кодирования разных символов. Сама большая проблема — это Какого черта мой текст нечитаем? Документ не испорчен по крайней мере, пока , и не нужно никакое волшебство. Вместо него надо просто выбрать правильную кодировку для отображения текста. Предполагаемый документ выше содержит биты: Если вы пожали плечами, то вы правы. Большая часть этих байтов начинается с 1. Если вы правильно помните, ASCII вообще-то не использует этот бит. Так что ASCII не вариант. Большая часть байт не является валидными значениями в этой кодировке. Как насчет Mac Roman еще одна европейская кодировка? Хм, для нее эти байты являются правильными значениями. Так что в Mac Roman текст будет выглядеть так: А компьютер-то откуда знает? Может кто-то хотел написать именно это. Насколько я знаю, это может быть последовательностью ДНК! Конечно, это полный бред. Кто бы мог подумать? Первая причина нечитаемости текста в том, что кто-то пытается прочитать последовательность байт в неверной кодировке. Компьютеру всегда нужно подсказывать. Сам он не догадается. Некоторые типы документов определяют кодировку своего содержимого, но последовательность байт всегда остается черным ящиком. Большинство браузеров предоставляют возможность указать кодировку страницы с помощью специального пункта меню. Иные программы тоже имеют аналогичные пункты. У автора нет разбиения на части, но статья и так длинна. Продолжение будет через пару дней. Информационная безопасность 2,4k авторов , 6,4k публикаций. Open source 1k авторов , 2,3k публикаций. Высокая производительность авторов , 1,2k публикаций. Программирование 2,9k авторов , 6,5k публикаций. Разработка систем передачи данных 62 автора , публикаций. Разработка под Linux автор , публикация. Алгоритмы 1,3k авторов , 2,3k публикаций. Системное программирование авторов , публикации. Тестирование веб-сервисов автор , публикаций. Анализ и проектирование систем авторов , публикации. Добавить в закладки Владимир Иванов dzigoro карма. В ней лучшие подборки статей с блога Джоэля. Сам хотел комментарий написать про Джоэля Спольски, вот даже ссылку нашел: Если ваш комментарий не саркастичный, то могу похвастаться, что буквально в субботу купил последний экземпляр данной книги за год которая в своем городе: А еще у этой книги есть продолжение www. Джоэл много чего написал и нарекомендовал, а вот стек оверфлоу больше похож на хорошую бизнес идею, чем на проект с сильной реализацией. Вот тут можно посмотреть что за 12 лет он понаписал больше тысячи статей www. Возможно он говорит правильные вещи, но мне кажется, что они у него больше от философствования, чем от опыта разработки 8. Stackoverflow — он не в серверах, а в комьюнити. На знаю насчет бизнес идеи, но для програмистов это просто незаменимый ресурс. Если у вас есть вопрос о программировании, вы почти наверняка найдете десяток готовых ответов на этом сайте. При чем качество меня продолжает изумлять —такие подробные и развернутые ответы трудно встретить в другом месте. Если ничего не случится, то продолжение будет завтра, максимум послезавтра. Не могу передать насколько я Вам благодарен за эту статью. И хотя я и до этого читал статьи про кодировки, хотя сама тема, признаю, достаточно проста, но почему-то до Вашей статьи у меня все равно оставался сумбур в голове. Статья не моя, я просто сделал перевод. Рад, что он оказался полезен. У меня была интересная идея сжимать файлы, засовывая внутрь определение его кодировки. Но есть более интересные алгоритмы. Принцип работы примерно такой — анализируем текст, наиболее часто встречающийся символ помечаем как 1, второй по популярности как 10, третий 11 и так далее. Очень красиво и лаконично, я считаю. Только не совсем так. Второй по популярности нельзя обозначить как 10, потому что дешифровщик решит, что единичка принадлежит первому по популярности, а на нолике он споткнётся. Строго говоря, в этом коде самый популярный символ всегда будет кодироваться либо ноликом либо единичкой, а коды для второго и всех последующих всегда будут начинаться с противоположного символа. То есть, если самый популярный имеет код 0, то все остальные будут начинаться с 1, и наоборот. Допустим, мы имеем сообщение из 7 символов АББВАБВ , А и В встречаются по 2 раза, Б встречается 3 раза, тогда согласно алгоритму он есть по вашей ссылке , А и В объединяются в символ АВ с суммой 4, дуге в сторону А присваивается 0, дуге в сторону В присваивается 1, затем новая вершина АВ объединяется с вершиной Б, в сторону Б идёт, допустим, 1 на самом деле всё равно, 0 или 1 , а в сторону вершины АВ идёт 0. Статья об этом алгоритме на Хабре, если кому интересно habrahabr. Все вот-вот собирался прочитать. Благодаря вам наконец-то прочту: Спасибо за труд, отлично получилось! Не понял один момент, почему в 4 строке UTF-8 использует 3 бита? Я статью не читал, но насколько я понял, ваш вопрос в том, почему в UTF тот же символ занимает два байта. Похоже, дело в том, что в некоторых ситуациях служебная информация в UTF занимает меньше места. Вот цитата из википедии: As a result, text in for example Chinese, Japanese or Hindi could take more space in UTF-8 if there are more of these characters than there are ASCII characters. This happens for pure text,[35] but rarely for HTML documents. For example, both the Japanese UTF-8 and the Hindi Unicode articles on Wikipedia take more space in UTF than in UTF В UTF нет служебной информации. Иными словами, UTF так же относится к UCS-2, как UTF-8 к ASCII, то есть является надмножеством. А как при декодировании узнать сколько байт занимает следующий символ? Проанализировав биты первого байта. В случае с UTF-8 длина символа определяется так: Все непервые байты символов при этом должны будут иметь вид 10xx xxxx , поэтому разрыв потока грозит потерей максимум одного символа. Да нет, в UTF-8 я понимаю как это происходит — с помощью служебных бит. Но если их нет в UTF, как определить символ занимает два или четыре байта? Стало быть, если попадается 01xx — xxxx, то перед нами четырёхбайтовый символ. Меня всегда поражало сколько информации в UTF-8 расходуется впустую. Случайно промазал по плюсику, но я вам компенсирую ;-. Зато экономит много байт, если весь или большая часть текста в ASCII. Это потому, что бит ы указывающие на то, что кодпоинт использует дополнительные байты тоже занимают место. Потому что в UTF-8 все значения, не влезающие в диапазон от 0 до кодируются следующим образом. В первом байте идёт столько единиц, сколько всего байт используется для кодирования символа, затем идёт ноль, а оставшиеся биты — это уже часть бинарного представления самого числа. Затем идут по 6 бит записи числа, с префиксом Таким образом, в 2 байтах можно записать 11 бит, так как в первом байте будет 3 служебных бита, во втором — 2. А этого недостаточно для кодирования битного значения. А чем плох " официальный " перевод? Спасибо за отличный перевод. Что касается Python, то Characters are an abstraction. A string is a sequence of those abstractions. Символы — это абстракция. А строки — это последовательность таких абстракций. Иными словами, пока вы в Python коде работаете со строками, то совершенно не нужно знать, как эти строки представляются байтами. Со строками можно производить обычные действия: А вот когда вам понадобится сохранить строку в файл или прочитать из сокета, тогда возникнет вопрос: Это знание помогло мне не беспокоится по пустякам, придало уверенности, мои волосы стали мягкие и шелковистые, и Я стал по другому смотреть на мир. Да, кстати, мне когда то эти простые правила помогли избавиться от проблем с кодировками. Теперь я даже не понимаю, почему говорят что в 2. На практике я их не встречаю. Вот только charset и encoding — нифига не одно и тоже. Например, ascii, windows, unicode. Например, 8bit 1 байт на число , utf-8, base Более точные определния даны в стандарте unicode, где-то в началных главах. То, что в заголовках http и в функциях php они перепутаны, не значит, что это одно и тоже. Хороший способ оконфузиться в этих терминах: Ну вот и развилась поддержка юникода до той черты, что можно такую статью читать прямо в браузере, и при этом символы вставлены именно символами, а не картинками. При решении практических задач, часто возникает необходимость узнать кодировку текста часто русскоязычного текста. Помочь может универсальный декодировщик много их разных, я пользуюсь — 2cyr. Метки лучше разделять запятой. Сейчас Вчера Неделя Привилегированные порты — причина глобального потепления 2. Интересные публикации Хабрахабр Geektimes. Хорошее начало — половина дела GT. Запуск Java классов и JAR-ов не по учебнику. Анализируя Ethereum, Биткоин и более других криптовалют с помощью PostgreSQL GT. Критическая уязвимость механизма аутентификации BIND позволяет похищать и изменять DNS-записи серверов. Во льдах Плавучего Континента: Разделы Публикации Хабы Компании Пользователи Песочница. Информация О сайте Правила Помощь Соглашение Конфиденциальность. Услуги Реклама Тарифы Контент Семинары.


Двоичная система счисления. Бит и байт. Сегментация памяти.


Ru Почта Мой Мир Одноклассники Игры Знакомства Новости Поиск Все проекты Все проекты. Категории Все вопросы проекта Компьютеры, Интернет Темы для взрослых Авто, Мото Красота и Здоровье Товары и Услуги Бизнес, Финансы Наука, Техника, Языки Философия, Непознанное Города и Страны Образование Фотография, Видеосъемка Гороскопы, Магия, Гадания Общество, Политика, СМИ Юридическая консультация Досуг, Развлечения Путешествия, Туризм Юмор Еда, Кулинария Работа, Карьера О проектах Mail. Ru Программирование Java JavaScript jQuery MySQL Perl PHP Python Веб-дизайн Верстка, CSS, HTML, SVG Системное администрирование Другие языки и технологии. Вопросы - лидеры Защита информации при передаче файлов с флэшки 1 ставка. Как сделать фрейм стороннего сайта, если он это запрещает? Посоветуйте учебники по HTML5 подходящие для начинающего с нуля человека. Лидеры категории Антон Владимирович Искусственный Интеллект. Голосование за лучший ответ. Полосатый жираф Алик Искусственный Интеллект 4 года назад Дура, она и есть дура.. Александр Печёркин Знаток 9 месяцев назад На уроках информатики учат, что один символ: Но в реальной жизни, из за существования огромного количества я зыков символы кодируются в 16 битную систему. То есть 1 символ - 16 бит 2 байта. Ru О компании Реклама Вакансии. Мы постоянно добавляем новый функционал в основной интерфейс проекта. К сожалению, старые браузеры не в состоянии качественно работать с современными программными продуктами. Для корректной работы используйте последние версии браузеров Chrome , Mozilla Firefox , Opera , Internet Explorer 9 или установите браузер Амиго.


Новые правила ккм
Отделка лоджии декоративной штукатуркой своими руками
Перевод слова любимый на английском
Нарисовать робота человека
На чертеже резьбуна стержне изображают
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment