Как найти длину сообщения в символах

Как определить количество информации

Все мы привыкли к тому, что все вокруг можно измерить. Мы можем определить массу посылки, длину стола, скорость движения автомобиля. Но как определить количество информации, содержащееся в сообщении? Ответ на вопрос в статье.

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

Как определить количество информации

Определение количества информации в сообщении

Для решения задачи нам нужно определить, сколько информации несет один символ сообщения, а потом умножить это значение на количество символов. И если количество символов мы можем посчитать, то вес символа нужно вычислить. Для этого посчитаем количество различных символов в сообщении. Напомню, что знаки препинания, пробел — это тоже символы. Кроме того, если в сообщении встречается одна и та же строчная и прописная буква — мы считаем их как два различных символа. Приступим.

В слове Принтер 6 различных символов (р встречается дважды и считается один раз), далее 7-й символ пробел и девятый — тире. Так как пробел уже был, то после тире мы его не считаем. В слове устройство 10 символов, но различных — 7, так как буквы  с, т и о повторяются. Кроме того буквы т и р уже была в слове Принтер. Так что получается, что в слове устройство 5 различных символов. Считая таким образом дальше мы получим, что в сообщении 20 различных символов.

Далее вспомним формулу, которую называют главной формулой информатики:

2i=N

Подставив в нее вместо N количество различных символов, мы узнаем, сколько информации несет один символ в битах. В нашем случае формула будет выглядеть так:

2i=20

Вспомним степени двойки и поймем, что i находится в диапазоне от 4 до 5 (так как 24=16, а 25=32). А так как бит — минимальная единица измерения информации и дробным быть не может, то мы округляем i в большую сторону до 5. Иначе, если принять, что i=4, мы смогли бы закодировать только 24=16 символов, а у нас их 20. Поэтому получаем, что i=5, то есть каждый символ в нашем сообщении несет 5 бит информации.

Осталось посчитать сколько символов в нашем сообщении. Но теперь мы будем считать все символы, не важно повторяются они или нет. Получим, что сообщение состоит из 39 символов. А так как каждый символ — это 5 бит информации, то, умножив 5 на 39 мы получим:

5 бит x 39 символов = 195 бит

Это и есть ответ на вопрос задачи — в сообщении 195 бит информации. И, подводя итог, можно написать алгоритм нахождения объема информации в сообщении:

  • посчитать количество различных символов.
  • подставив это значение в формулу 2i=N найти вес одного символа (округлив в большую сторону)
  • посчитать общее количество символов и умножить это число на вес одного символа.

Автор:

Как посчитать длину текста и не привлекать внимание санитаров

Время на прочтение
10 мин

Количество просмотров 29K

Привет! Меня зовут Ивасюта Алексей, я фронтенд-разработчик в Авито в кластере Seller Experience. В этой статье я расскажу, как правильно рассчитать длину текста в Java Script. Эта статья будет одинаково полезна как начинающим разработчикам, так и весьма опытным. Благодаря ей вы поймете устройство Unicode и особенности его работы в JS.

Немного предыстории

На нашей платформе можно размещать объявления и давать им описание в виде текста. Обычно для таких полей есть ограничение на максимальное количество вводимых символов. Если пользователь напечатал больше знаков, чем положено, сработает валидация и объявление нельзя будет разместить. 

В целом, достаточно тривиальная практика. Жили мы, не тужили, разрешали вводить в поля только кириллицу, латиницу и цифры — и все работало прекрасно. Однажды мы подумали: «Почему бы не разрешить пользователям добавлять в описание эмодзи?». Сделали правочки, разрешили ввод новых символов и продолжили жить дальше. Но тут началось интересное: некоторые пользователи стали жаловаться, что они вводят символов меньше лимита, но валидацию описание все равно не проходит. Путем нехитрых проверок удалось найти интересные вещи. Давайте посмотрим на код:

'Фотоаппарат'.length
// 11
'Фотоаппарат📷'.length
// 13

Длина слова «Фотоаппарат» равна 11. Если в конец добавить эмодзи, то длина становится равной 13. Может показаться, что это какой-то баг языка, но нет — всё правильно. И вот тут нам с вами придется нырнуть на самое дно Unicode.

Щепотка теории по Unicode

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

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

В Unicode кодовую точку принято записывать в шестнадцатеричном виде и использовать не менее 4 цифр с ведущими нулями при необходимости. Например, число 0 в шестнадцатеричной системе счисления также имеет значение 0 и будет записано в виде U+0000 (U+ — префикс, обозначающий Unicode-символ). Это пустой символ или же аналог null/nil в Unicode. Обычно этот символ используется для обозначения конца null-терминированных строк в языке С (Си-строки). 

null-терминированные строки

В языке С обработка строки произвольной длины происходит до того момента, пока не встретится нулевой символ.

Четыре разряда в шестнадцатеричной системе позволяют закодировать 164 комбинаций (или 216) — это 65 536 значений, каждое из которых является кодовой точкой. Значения находятся в диапазоне U+0000 — U+FFFF в шестнадцатеричной системе счисления. Этот диапазон значений называется «Базовой многоязычной плоскостью» или BMP. Она включает в себя символы из алфавитов самых распространенных языков мира, математические операторы, геометрические фигуры, специальные символы и многое другое. Важно заметить, что некоторые точки являются зарезервированными, некоторые из них не имеют графического представления, как например U+200D, а некоторые вообще не используются.

После того, как мы изучили теорию, давайте посмотрим на несколько примеров и пощупаем Unicode на практике.

Для получения значения кодовой точки в JS есть метод String.prototype.codePointAt(). Если мы вызовем метод на строке с заглавной кириллической буквой «А», то получим значение кодовой точки в десятичной системе счисления.

'А'.codePointAt(0) // 1040

Теперь переведем полученное значение в шестнадцатеричную систему счисления.

'А'.codePointAt(0).toString(16) // '410'

В JS шестнадцатиразрядные числа можно записывать в формате 0x0000. Таким образом наше число можно записать в виде 0x410.

0x410 // 1040
typeof 0x410 === 'number' // true

Для получения Unicode-символа по значению кодовой точки JS предоставляет статический метод String.fromCodePoint(). Давайте получим нашу букву обратно.

String.fromCodePoint(0x410) // 'А'

Для записи символов Unicode можно использовать формат u0000. Если число меньше четырех знаков, то недостающие заполняются нулями слева. Таким образом нашу букву также можно представить в виде строки.

'u0410' // 'А'

Теперь мы можем даже составить целое слово. Вставьте эту строку в консоль и посмотрите на результат.

'u041fu0440u0438u0432u0435u0442'

Нормализация и комбинируемые символы

Перейдем к неочевидному поведению строк в Java Script. Возьмем для примера такой экзотический символ, как «Слог Хангыль ggag» из слогового письма Хангыля и посчитаем его длину.

'깍'.length // 3

Ого! Символ один, а длина строки почему-то равна трем. На самом деле, этот символ состоит из трех кодовых точек U+1101, U+1161 и U+11A8. Вместе эти знаки в Хангыльском письме образуют иероглиф , который сам является отдельным символом и имеет кодовую точку U+AE4D. 

Здесь мы приходим к двум важным выводам:

  1. Длина строки в JS считается по количеству кодовых точек, из которых она состоит.

  2. При подсчете длины строки надо учитывать количество графем, а не кодовых точек.

Так, у нас появилось новое понятие. Графема — это минимальная единица письменности. В нашем случае, три кодовые точки образуют одну графему, которая отображается в виде иероглифа  .

В Unicode для таких случаев описаны алгоритмы нормализации, когда комбинируемые символы могут быть заменены на один составной. JS предоставляет метод String.prototype.normalize, который позволяет проводить нормализацию строк по описанным в Unicode алгоритмам. После выполнения нормализации три кодовые точки будут заменены на одну — U+AE4D.

'깍'.normalize()
    .codePointAt(0)
    .toString(16) // 'ae4d'

'깍'.normalize('NFC').length // 1

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

'ко̅д'.normalize().length // 4

Длина строки в этом случае равна 4, а видим мы всего три графемы. Символ о̅ состоит из обычной кириллической буквы «о» и Unicode-символа комбинируемого надчеркивания U+0305. 

'коu0305д' // ко̅д

В таких случаях при учете длины строки нужно исключать из расчета комбинируемые символы. Они не создают отдельных графем, а просто видоизменяют отображение рядом стоящих. Для этого можем воспользоваться экранированием свойств Unicode в регулярках JS.

const regexSymbolWithCombiningMarks = /(P{Mark})(p{Mark}+)/ug;

const countTextLength = (text) => {
    const normalizedText = text
        .normalize('NFC')
        .replace(regexSymbolWithCombiningMarks, function(_, symbol) {
            return symbol;
        });

    return normalizedText.length;
};

countTextLength('ко̅д') // 3
countTextLength('깍') // 1

Селекторы начертания

В Unicode есть диапазон кодовых точек U+FE00 — U+FE0F для селекторов начертания. Это невидимые символы, которые изменяют начертание предшествующих им. Самый интересный — U+FE0F. Этот селектор указывает, что предыдущий символ должен отображаться в виде эмодзи, если предыдущий символ по умолчанию имеет текстовое представление. Например, кодовая точка U+2764 по умолчанию будет отображаться как закрашенное жирное сердечко . Если мы добавим к нему селектор начертания U+FE0F, то отображаться он уже будет в виде эмодзи сердечка ❤️.

'❤ufe0f' // ❤️

Отображение в консоли браузера

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

То же самое можно проделать со снеговиком.

'☃ufe0f' // ☃️

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

'❤ufe0E'.replace(/[u{FE00}-u{FE0F}]/ug, '').length // 1

Суррогаты

Однажды IT-сообществу захотелось добавить в Unicode больше символов, а диапазон в 65К кодовых точек стал тесноват. Ребята из Unicode Consortium призадумались и решили заложить в стандарт больше возможностей для дальнейшего расширения. 

Так как надо было сохранить совместимость с уже существующими значениями и сильно увеличить количество допустимых, диапазон кодовых точек расширили до U+10FFFF. В Unicode появилось еще 16 плоскостей по 65 536 символов в каждой. Таким образом, количество возможных значений увеличилось до 1 114 112. Сейчас в Unicode есть эмодзи, кости для маджонга, алхимические символы, символы «Канона великого сокровенного» и куча всего другого. 

Теперь нам надо немного вспомнить азы программирования. Для кодирования каждого символа необходимо n бит. Число 1 в двоичной системе счисления будет иметь вид 1, а для его кодирования нужен 1 бит. Число 65535 будет иметь вид 1111111111111111. У него 16 разрядов, соответственно, для хранения нужно 16 бит, то есть 2 байта.

Существует кодировка UTF-8, которая использует 8 бит на кодирование каждого символа. При помощи нее можно закодировать 256 различных знаков (28). Строки в этой кодировке занимают очень мало места: текст в 10 000 знаков будет занимать 10 000 байт или 9,77 КБ. Это позволяет оптимизировать использование памяти.

Есть кодировка UTF-32, которая использует 32 бита на кодирование каждого символа. Здесь больше 4 миллиардов комбинаций. Как можно догадаться, любой символ из любой плоскости Unicode может быть с легкостью закодирован, но строки в ней занимают много памяти. Так текст в 10 000 знаков уже будет занимать больше 32 КБ.

Самое интересное происходит в системах, которые используют шестнадцатибитную кодировку представления. JavaScript использует именно кодировку UTF-16, которая позволяет выделять на хранение каждого символа 2 байта. Для хранения кодовой точки из BMP этого достаточно, но для точек из других плоскостей нужно больше бит. 

Число 10000 в шестнадцатеричной системе преобразуется в 10000000000000000 в двоичной. У числа 17 разрядов, а значит для кодирование уже нужно 17 бит. Уместить 17 бит в 2 байта никак нельзя. 

Чтобы кодировать символы из астральных плоскостей в 16-битных кодировках были придуманы суррогатные пары. Суррогаты — это зарезервированный диапазон значений в базовой плоскости Unicode, который делится на две части:

  • U+D800 – U+DBFF — верхние суррогаты;

  • U+DC00 – U+DFFF — нижние суррогаты.

В каждый диапазон входит 210 символов. То есть всего возможно 220 комбинаций — это 1 048 576 значений. Добавим сюда 65 536 значений из BMP и получим 1 114 112 значений. Таким образом мы можем закодировать кодовые точки из всех плоскостей Unicode.

Точки из BMP кодируются «как есть». Если же надо закодировать кодовую точку из астральной плоскости, то для нее вычисляется пара суррогатов по формуле:

const highSurrogate = Math.floor((codepoint - 0x10000) / 0x400) + 0xD800;
const lowSurrogate = (codepoint - 0x10000) % 0x400 + 0xDC00;

Для обратного преобразования из суррогатной пары в кодовую точку используется следующая формула:

const codePoint = (highSurrogate - 0xD800) * 0x400 + lowSurrogate - 0xDC00 + 0x10000;

Таким образом, ухмыляющийся смайлик U+1F600 будет преобразован в суррогатную пару U+D83D + U+DE00.

'😀' === 'u{d83d}u{de00}'
// true

Именно поэтому длина этого эмодзи равна 2.

Формат записи кодовых точек

До этого момента вы видели запись кодовых точек в строках только в виде u0000. Такой формат записи является устаревшим и будет работать только для кодовых точек из BMP. Вместо него используйте запись вида u{0000}. Такой формат работает для кодовых точек из любой плоскости.

'😀'.length === 2
// true

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

const countGraphemes = (text) => {
    let count = 0;
    for(const _ of text) {
        count++;
    }
    return count;
}
countGraphemes('текст 😀') // 7

То же самое можно сделать разбив строку на массив.

Array.from('текст 😀').length // 7

// или

[...'текст 😀'].length // 7

Модификаторы цвета

В Unicode есть пять модификаторов цвета кожи по шкале Фитцпатрика в диапазоне  U+1F3FB —U+1F3FF.

При помощи этих модификаторов можно персонифицировать «базовые» эмодзи.

'👩u{1f3fb}'
// '👩🏻'

'👧u{1f3fc}'
// '👧🏼'

'🧒u{1f3fd}'
// '🧒🏽'

'👶u{1f3fe}'
// '👶🏾'

'👨u{1f3ff}'
// '👨🏿'

Как вы уже могли догадаться, модификаторы цвета при подсчете длины текста учитывать не надо.

Объединитель нулевой ширины

Давайте подсчитаем длину эмодзи семьи из трех человек.

'👨‍👩‍👦'.length
// 8

Весьма неожиданный результат. Давайте теперь разобьем строку на массив символов.

[...'👨‍👩‍👦']
// ['👨', '‍', '👩', '‍', '👦']

Теперь мы видим настоящую магию: эмодзи семьи из трех человек на самом деле состоит из трех базовых эмодзи, которые соединены объединителем нулевой ширины или ZWJ. Этот символ не имеет графического отображения и представлен кодовой точкой U+200D. А при помощи такой хитрой конструкции мы можем собрать новый эмодзи из базовых.

['👨', 'u{200d}', '👧', 'u{200d}', '👦'].reduce((prev, curr) => prev + curr)
// '👨‍👧‍👦'

Мы получили эмодзи отца-одиночки с двумя детьми.

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

Собираем все вместе

const regex = /[u{FE00}-u{FE0F}]|[u{1F3FB}-u{1F3FF}]/ug;
// u{FE00}-u{FE0F} -- селекторы начертания
// u{1F3FB}-u{1F3FF} - модификаторы цвета

const regexSymbolWithCombiningMarks = /(P{Mark})(p{Mark}+)/ug; // Поиск комбинируемых символов
const joiner = '200d'; // Объединитель нулевой ширины («Zero Width Joiner», ZWJ)
//  Проверяет, является ли символ ZWJ
const isJoiner = (char) => char.charCodeAt(0).toString(16) === joiner;

const countGraphemes = (text) => {
   const normalizedText = text
       // нормализуем строку
       .normalize('NFC')   
       // удаляем селекторы начертания и модификаторы цвета
       .replace(regex, '')
       // удаляем комбинируемые символы
       .replace(regexSymbolWithCombiningMarks, function(_, symbol) {
           return symbol;
       });
   // Разделяем строку на токены. Кодовые точки из суррогатных пар будут корректно 
   // выделены в одну графему.
   const tokens = Array.from(normalizedText);
   let length = 0;
   let isComplexChar = false; // Обработка комплексных символов, склеенных через ZWJ
   
   // Итеррируемся по массиву токенов и комбинации, склеенные через ZWJ 
   // считаем за одиу графему
   for (let i = 0; i < tokens.length; i++) {
       const char = tokens[i];
       const nextChar = tokens[i + 1];

       if (!nextChar) {
           length += 1;
           continue;
       }

       if (isJoiner(nextChar)) {
           isComplexChar = true;
           continue;
       }

       if (!isJoiner(char) && isComplexChar) {
           isComplexChar = false;
       }

       if (!isComplexChar) {
           length += 1;
       }
   }

   return length;
}

countGraphemes('test😄') // 5
countGraphemes('👦🏾👨‍👩‍👧‍👦') // 2
countGraphemes('깍') // 1

//  и так далее

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

Intl.Segmenter

Как вы видите, алгоритм подсчета количества графем получается не самым простым. Здесь требуется учитывать множество деталей и быть глубоко погруженным в тему. И вот наконец-то настает очередь Intl.Segmenter специальный класс, который включает сегментацию текста с учетом языковых стандартов. Это позволяет получать значимые элементы из строки, например, графемы, слова или предложения.

const segmenter = new Intl.Segmenter();
const text = '👨‍👨‍👦‍👦깍ко̅д👨🏿‍';

const iterator = segmenter.segment(text)[Symbol.iterator]();
let count = 0;
for (const symbol of iterator) {
  	count++;
}
console.log(count) // 6

Вот так легко и непринуждённо мы смогли в несколько строчек проделать ту же работу. По умолчанию сегментер бьет текст на графемы, но ему можно дополнительно задать локаль и степень сегментации, например, по словам.

const segmenter = new Intl.Segmenter('fr', { granularity: 'word' });

У меня для вас только одна плохая новость: Intl.Segmenter не поддерживается в Firefox, поэтому кроссбраузерное решение сделать на нем не получится. Пока что вам остается искать рабочий полифил для него и подключать в нужном месте при выполнении кода. Также нужно убедиться в работоспособности сегментации через полифил.

Что в результате

Честный подсчет длины введенного пользователем текста — дело непростое из-за особенностей Unicode и 16-битной кодировки. Если вы хотите сделать по-настоящему интернациональное приложение, например, мессенджер, вам придется учитывать все эти сценарии. Эту проблему призван решить Intl.Segmenter, поэтому с нетерпением ждем его поддержки в Firefox.

Полезные ссылки

Таблица символов Unicode 

Подробнее о графемах 

Алгоритмы нормализации Unicode 

Документация Intl.Segmenter на MDN 

Подробнее про Intl.Segmenter

Экранирование свойств Unicode 

На прошлых уроках мы
узнали:

·     Алфавитом
языка
называется набор всех различных символов, которые
используются для представления информации на этом языке.

·     Любой
алфавит характеризуется своей мощностью, так называется количество
символов, которые в него входят.

·     Мощность
двоичного алфавита – всего два символа.

·     Двоичным
кодированием
называется запись информации с помощью
символов двоичного алфавита, а двоичным кодом – код информации,
получившийся в результате двоичного кодирования.

·     Двоичное
кодирование универсально
, это означает, что с помощью
двоичного кода можно представить любую информацию.

·     На
компьютере любая информация хранится в виде двоичных кодов.

Вопросы:

·     Алфавитный
подход к измерению информации.

·     Информационный
вес символа.

·     Информационный
объём сообщения.

·     Единицы
измеряется информации.

Как мы помним, информация
для человека
– это набор сигналов, которые человек получает из различных
источников. Человек, каким-то образом их воспринимает и интерпретирует, придёт
им какое-то значение. Однако разные люди могут интерпретировать сигналы по-разному.
Так одно и то же сообщение, то есть один и тот же набор сигналов, может нести
разным людям совершенно разную информацию. Как же тогда можно измерить
информацию?

Всего существует два
подхода к измерению информации. Первый подход – содержательный. Как ясно
из названия, он оценивает содержание информации. А как же можно оценить
содержание информации? Универсально оценить содержание любой информацию
позволяют её свойства
: объективность, достоверность полнота, актуальность,
полезность и понятность. Однако, часть свойств информации субъективна, то есть
для разных людей информация может быть по-разному полезна, понятна или
актуальна. Потому измерение информации с помощью этого подхода часто тоже
субъективно. Для того, чтобы объективно измерить информацию нельзя опираться на
её содержание.

Измерить информацию независимо
от её содержания позволяет алфавитный подход.  Рассмотрим его подробнее.
Прежде чем что-нибудь выразить количественно, необходимо установить, для этого
единицу измерения. Так расстояние измеряется в метрах, а время в секундах. А в
чём же измеряется информация? В алфавитном подходе считается, что каждый символ
алфавита, который использован для записи информации, имеет некоторый
информационный вес. Это означает, что он несёт некоторое количество информации.
Все символы одного и того же алфавита имеют одинаковый информационный вес.
Информационный вес каждого из символов алфавита зависит от мощности этого
алфавита. Минимальная единица измерения информации – это информационный вес
одного символа двоичного алфавита. Эта величина получила название один бит
Слово бит на английском языке (Bit)
произошло как результат сокращения словосочетания «Binary
digit», что в переводе
на русский язык, означает «двоичный символ».

Почему же именно один бит
был принят в качестве минимальной единицы измерения информации? Как мы помним
из прошлого урока, любую информацию можно записать в виде её двоичного кода, то
есть представить её как совокупность двоичных символов. В то же время меньшей
информационной единицы, чем один бит просто не существует. Наверняка у вас
возник вопрос, почему? Вспомним, чем является любой алфавит. Любой алфавит –
это знаковая система. А какая знаковая система минимальна? Сколько символов она
содержит? 2. Так как 1 символ, вне знаковой системы не может нести информацию.
То есть двоичный алфавит – это минимальная знаковая система.

Раньше мы узнали, что
алфавит любого языка, естественного или формального можно заменить двоичным
алфавитом. Для этого всем символам алфавита можно присвоить уникальные двоичные
коды одинаковой разрядности. Причём минимальная разрядность двоичного кода, необходимая,
для кодирования одного символа алфавита,
зависит от мощности кодируемого алфавита. Запишем выражение для этой
зависимости. Мощность алфавита обозначим латинской буквой «М», а минимальную
необходимую разрядность двоичного кода – буквой «i».
Тогда M = 2i,
или перемноженной последовательности из i
двоек. При этом, если мощность алфавита нельзя получить простым перемножением
двоек, то она увеличивается до числа, которое можно получить таким образом. Это
делается потому, что иначе двоичный код с меньшей разрядностью не сможет
уникальным образом закодировать все символы алфавита.

Информационным весом
символа
называется, количество информации, которое он несёт в
рамках своего алфавита. Она равна минимальной разрядности двоичного кода,
необходимой для равномерного кодирования алфавита этого символа. Информационный
вес символа, как и любая информация измеряется в битах.

Задача: алфавит
русского языка содержит:

·    
тридцать
три буквы,

·    
десять
арабских цифр,

·    
одиннадцать
знаков препинания,

·    
и
пробел.

Вычислить информационный
вес одного символа из алфавита русского языка.

В начале нужно найти
мощность русскоязычного алфавита M.
Для этого посчитаем общее число всех символов: букв – 33, количество цифр – 10,
количество знаков препинания – 11 и добавим ещё 1, то есть пробел. M
= 33 + 10 + 11+ 1 = 55. Общая мощность русского алфавита равна 55 символам.
Теперь найдём, какая разрядность двоичного кода потребуется, чтобы закодировать
1 символ алфавита мощностью 55 символов. Информационный вес символа будет равен
этой разрядности. То есть M
= 55 = 2i. Число 55 мы не можем
получить простым перемножением двоек. Поэтому увеличим число до 64-х. Для того,
чтобы получить 64, нужно перемножить 6 двоек или 26. i
= 6. Мы можем дать ответ: информационный вес одного символа русского алфавита –
6 бит.

Таким образом мы
научились измерять информацию, которую несёт 1 символ алфавита. Однако в
действительности информация передаётся целыми сообщениями, которые складываются
из множества символов. Как же измерить такую информацию? Размер информации,
которую несёт сообщение, называется его информационным объёмом. Он
складывается из информационных весов всех символов, из которых состоит
сообщение. Его можно рассчитать следующим образом… Обозначим информационный
объём сообщения латинской буквой «V»,
а латинской буквой «L» — длину сообщения, в
символах. Так V = i
× L. То есть информационный
объём равен произведению информационного веса одного символа и количества
символов в сообщении.

Задача: сообщение
содержит 296 бит информации. Его длина – 37 символов. Какова максимальная
мощность алфавита, с помощью символов которого записано это сообщение?

Так как мы знаем
информационный объём сообщения и его длину – мы можем найти информационный вес
одного его символа. Информационный вес символа равен информационному объёму
сообщения делённому на длину сообщения, i
= V / L.
296 / 37 = 8 бит. Информационный вес одного символа нашего алфавита – восемь
бит. Так как мы знаем информационный вес каждого символа алфавита, то есть
разрядность двоичного кода символа такого алфавита, мы можем найти его
максимальную мощность. Максимальная мощность равна двум в степени
информационного веса символа. M
= 2i = 28 = 256.
Мы можем дать ответ: максимальная мощность алфавита – 256 символов.

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

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

Так же существуют и ещё
более крупные единицы информации, например килобайты (Кб). Некоторые из вас
могут подумать, что в 1 килобайте 1000 байт, так же как в 1 килограмме – 1000
грамм. Однако это не верно. Для более удобного измерения информации на
компьютере 1 килобайт содержит не 1000, а 1024 байта. Почему именно 1024?
Потому, что 1024 = 210. Есть и ещё более крупные величины. Так один
мегабайт (Мб) содержит 1024 Кб. Ещё десять лет назад информация, содержащаяся на
компьютере, измерялась в гигабайтах. Один гигабайт (Гб) содержит 1024 Мб. Сейчас
на одном домашнем компьютере могут храниться терабайты (Тб) информации, и в 1 Тб
– сколько, как вы думаете? – Правильно: 1024 Гб.

Задача:
на заводе работает автоматическая система учёта рабочего времени. По приходу на
работу, и при уходе с работы сотрудник вставляет свою карту-пропуск в
специальное устройство и оно заносит в память сообщение, которое состоит из 2
частей: уникального двоичного кода сотрудника и текущего времени. Найти
минимальный информационный объём, который устройство внесло
в память за день, если известно, что:

·     всего
на заводе работает 714 сотрудников;

·     на
работу вышло 698 сотрудников;

·     часть
сообщения, которая содержит текущее время, имеет информационный объём 3 байта;

·     все
уникальные двоичные коды сотрудников имеют одинаковую разрядность.

Итак, минимальный
информационный объём – Vобщ.,
который устройство занесло в память в течение дня можно найти, умножив
информационный объём одного сообщения Vсообщ.
на количество сообщений Nсообщ.
Количество сообщений Nсообщ.
равно количеству сотрудников Nсотр.,
которые вышли на работу в течение дня, умноженному на 2, так как на каждого
сотрудника приходится 2 сообщения: одно – когда он приходит на работу, а второе
– когда уходит. Nсообщ.
= Nсотр.
× 2 = 1396 сообщений за день.

Информационный объём
одного сообщения состоит из информационного объёма уникального двоичного кода
сотрудника Vкода и
информационного объёма времени, который равен 3 байтам. Теперь нам нужно найти
информационный объём уникального двоичного кода сотрудника. Мы можем
представить всех сотрудников, которые работают на заводе, в качестве алфавита
мощностью 714 символов. Нам остаётся найти информационный вес одного символа.

Как мы помним это можно
сделать по формуле M=2i.
Мы не можем получить 714 путём перемножения двоек, зато мы можем так получить
число 1024. 1024 = 210. Значит информационный объём Vкода
= 10 бит. Теперь найдём информационный объём Vсообщ.
он состоит из 10 бит уникального двоичного кода и 3 байт времени. Переведём 3
байта в биты, для этого умножим число 3 на 8. 3 × 8 = 24 бита и 10 бит
кода. Информационный объём одного сообщения Vсообщ. =
24 + 10 = 34 бита. Теперь остаётся лишь найти информационный объём Vобщ.
Для этого информационный объём одного сообщения Vсообщ.
умножим на количество сообщений Nсообщ.
34 × 1396 = 47 464 бита. Для удобства переведём в более крупные величины.
47 464 / 8 = 5933 байта, 5933 / 1024 = 5,8 Кб. Ответ: За день в память
устройства поступило 5,8 Кб информации.

Важно запомнить:

·     Алфавитный
подход
позволяет измерить объём информации не зависимо от её
содержания. При этом каждый символ несёт, некоторое количество информации, имеет
информационный вес (
i).

·     Минимальная
единица измерения информации – 1 бит.

·     Мощность
алфавита
равна двум в степени, равной информационному весу
символа (M = 2i).

·     Информационный
объём
сообщения равен произведению информационного веса
одного символа и длины сообщения (V
=
i × L).

·     1
байт

= 8 бит.

·     Байты,
килобайты (Кб), мегабайты (Мб), гигабайты (Гб), терабайты (Тб)

– единицы измерения информация. Каждая следующая больше предыдущей в 1024 раза.

§ 1.6. Измерение информации

Информатика. 7 класса. Босова Л.Л. Оглавление


Ключевые слова:

  • бит
  • информационный вес символа
  • информационный объём сообщения
  • единицы измерения информации

1.6.1. Алфавитный подход к измерению информации

Одно и то же сообщение может нести много информации для одного человека и не нести её совсем для другого человека. При таком подходе количество информации определить однозначно затруднительно.

Алфавитный подход позволяет измерить информационный объём сообщения, представленного на некотором языке (естественном или формальном), независимо от его содержания.

Для количественного выражения любой величины необходима, прежде всего, единица измерения. Измерение осуществляется путём сопоставления измеряемой величины с единицей измерения. Сколько раз единица измерения «укладывается» в измеряемой величине, таков и результат измерения.

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

Обратите внимание, что название единицы измерения информации «бит» (bit) происходит от английского словосочетания binary digit — «двоичная цифра».

За минимальную единицу измерения информации принят 1 бит. Считается, что таков информационный вес символа двоичного алфавита.

1.6.2. Информационный вес символа произвольного алфавита

Ранее мы выяснили, что алфавит любого естественного или формального языка можно заменить двоичным алфавитом. При этом мощность исходного алфавита N связана с разрядностью двоичного кода i, требуемой для кодирования всех символов исходного алфавита, соотношением: N = 2i.

Разрядность двоичного кода принято считать информационным весом символа алфавита. Информационный вес символа алфавита выражается в битах.

Информационный вес символа алфавита i и мощность алфавита N связаны между собой соотношением: N = 2i.

Задача 1. Алфавит племени Пульти содержит 8 символов. Каков информационный вес символа этого алфавита?

Решение. Составим краткую запись условия задачи.

§ 1.6. Измерение информации

Известно соотношение, связывающее величины i и N : N = 2i.

С учётом исходных данных: 8 = 2i. Отсюда: i = 3.

Полная запись решения в тетради может выглядеть так:

§ 1.6. Измерение информации

1.6.3. Информационный объём сообщения

Информационный объём сообщения (количество информации в сообщении), представленного символами естественного или формального языка, складывается из информационных весов составляющих его символов.

Информационный объём сообщения I равен произведению количества символов в сообщении К на информационный вес символа алфавита i;I = К • i.

Задача 2. Сообщение, записанное буквами 32-символьного алфавита, содержит 140 символов. Какое количество информации оно несёт?

§ 1.6. Измерение информации

Задача 3. Информационное сообщение объёмом 720 битов состоит из 180 символов. Какова мощность алфавита, с помощью которого записано это сообщение?

§ 1.6. Измерение информации

1.6.4. Единицы измерения информации

В наше время подготовка текстов в основном осуществляется с помощью компьютеров. Можно говорить о «компьютерном алфавите», включающем следующие символы: строчные и прописные русские и латинские буквы, цифры, знаки препинания, знаки арифметических операций, скобки и др. Такой алфавит содержит 256 символов. Поскольку 256 = 28, информационный вес каждого символа этого алфавита равен 8 битам. Величина, равная восьми битам, называется байтом. 1 байт — информационный вес символа алфавита мощностью 256.

1 байт = 8 битов

Бит и байт — «мелкие» единицы измерения. На практике для измерения информационных объёмов используются более крупные единицы:

1 килобайт = 1 Кб = 1024 байта = 210 байтов
1 мегабайт = 1 Мб = 1024 Кб = 210 Кб = 220 байтов
1 гигабайт = 1 Гб = 1024 Мб = 210 Мб = 220 Кб = 230 байтов
1 терабайт = 1 Тб = 1024 Гб = 210 Гб = 220 Мб = 230 Кб = 240 байтов

Задача 4. Информационное сообщение объёмом 4 Кбайта состоит из 4096 символов. Каков информационный вес символа используемого алфавита? Сколько символов содержит алфавит, с помощью которого записано это сообщение?

§ 1.6. Измерение информации

Ответ: 8 битов, 256 символов.

Задача 5. В велокроссе участвуют 128 спортсменов. Специальное устройство регистрирует прохождение каждым из участников промежуточного финиша, записывая его номер цепочкой из нулей и единиц минимальной длины, одинаковой для каждого спортсмена. Каков будет информационный объём сообщения, записанного устройством после того, как промежуточный финиш пройдут 80 велосипедистов?

Решение. Номера 128 участников кодируются с помощью двоичного алфавита. Требуемая разрядность двоичного кода (длина цепочки) равна 7, так как 128 = 27. Иначе говоря, зафиксированное устройством сообщение о том, что промежуточный финиш прошёл один велосипедист, несёт 7 битов информации. Когда промежуточный финиш пройдут 80 спортсменов, устройство запишет 80 • 7 = 560 битов, или 70 байтов информации.

Ответ: 70 байтов.


Самое главное.

При алфавитном подходе считается, что каждый символ некоторого сообщения имеет опредёленный информационный вес — несёт фиксированное количество информации.

1 бит — минимальная единица измерения информации.

Информационный вес символа алфавита i и мощность алфавита N связаны между собой соотношением: N = 2i.

Информационный объём сообщения I равен произведению количества символов в сообщении К на информационный вес символа алфавита i: I = K•i.

1 байт = 8 битов.

Байт, килобайт, мегабайт, гигабайт, терабайт — единицы измерения информации. Каждая следующая единица больше предыдущей в 1024 (210) раза.


Вопросы и задания.

1.Ознакомтесь с материалами презентации к параграфу, содержащейся в электронном приложении к учебнику. Используйте эти материалы при подготовке ответов на вопросы и выполнении заданий.

2. В чём суть алфавитного подхода к измерению информации?

3. Что принято за минимальную единицу измерения информации?

4. Что нужно знать для определения информационного веса симво­ла алфавита некоторого естественного или формального языка?

5. Определите информационный вес i символа алфавита мощ­ностью N, заполняя таблицу

6. Как определить информационный объём сообщения, представлен­ного символами некоторого естественного или формального языка?

7. Определите количество информации в сообщении из Ксимво­лов алфавита мощностью N, заполняя таблицу

8. Племя Мульти пишет письма, пользуясь 16-символьным алфави­том. Племя Пульти пользуется 32-символьным алфавитом. Вож­ди племён обменялись письмами. Письмо племени Мульти содер­жит 120 символов, — а письмо племени Пульти — 96. Сравните информационные объёмы сообщений, содержащихся в письмах

9. Информационное сообщение объёмом 650 битов состоит из 130 символов. Каков информационный вес каждого символа этого сообщения?

10. Выразите количество информации в различных единицах, заполняя таблицу

11. Информационное сообщение объёмом 375 байтов состоит из 500 символов. Каков информационный вес каждого символа этого сообщения? Какова мощность алфавита, с помощью кото­рого было записано это сообщение?

12. Для записи текста использовался 64-символьный алфавит. Какое количество информации в байтах содержат 3 страницы текста, если на каждой странице расположено 40 строк по 60 символов в строке?

13. Сообщение занимает 6 страниц по 40 строк, в каждой строке за­писано по 60 символов. Информационный объём всего сообще­ния равен 9000 байтам. Каков информационный вес одного сим­вола? Сколько символов в алфавите языка, на котором записано это сообщение?

14. Метеорологическая станция ведёт наблюдение за влажностью воздуха. Результатом одного измерения является целое число от 0 до 100 процентов, которое записывается цепочкой из нулей и единиц минимальной длины, одинаковой для каждого изме­рения. Станция сделала 8192 измерения. Определите информа­ционный объём результатов наблюдений.

15. Племя Пульти пользуется 32-символьным алфавитом. Свод основных законов племени хранится на 512 глиняных таблич­ках, на каждую из которых нанесено ровно 256 символов. Какое количество информации содержится на каждом носителе? Какое количество информации заключено во всём своде законов?


Оглавление

§ 1.5. Двоичное кодирование

§ 1.6. Измерение информации

Тестовые задания для самоконтроля


Определение длины сообщения

Всего в 1 SMS доступно до 70 знаков на кириллице или до 160 знаков на латинице. Если сообщение не умещается в одну SMS, оно разбивается пропорционально на несколько SMS и будет доставлено как единое целое.

Максимальная длина сообщения составляет 480 символов. SMS сообщение может быть составлено в двух форматах: Unicode (в том числе и русский язык) и 7bit (английский текст и большинство символов). Сообщение может состоять из одного или нескольких SMS. Подсчет количества SMS, содержащемся в одном сообщении на основании введенного текста, выполняется по формулам:

  • unicode: если длина <=70, то 1 SMS, иначе, количество SMS определяется как: кол-во SMS = длина сообщения в символах / 67 (например, текст длиной 135 символов считается как 3 SMS сообщения).
  • 7bit: если длина <=160, то 1 SMS, иначе количество SMS определяется как: кол-во SMS = длина сообщения в символах / 153 (например, текст длиной 310 символов считается как 3 SMS сообщения).

Также символы, которые обычно относятся к стандартной ASCII-кодировке, в GSM представляются в формате Unicode: ^ { } [ ] | ~

Получить коммерческое предложение

Оставьте свои контактные данные. С вами свяжется наш менеджер и подробно расскажет о стоимости и возможностях СМС рассылки.

Выбирайте лучшее

Персональный менеджер

Забота о каждом клиенте

Провайдер с лицензией

Ответственность за свое дело

Прямые подключения

Гарантируем качество СМС рассылки

Удобный личный кабинет

Быстрый старт. Online отчеты

Низкие цены

Надежность, качество, экономичная цена

Понравилась статья? Поделить с друзьями:
  • Как можно найти массу в физике
  • На видео плохой звук как исправить
  • Как исправить ошибку oracle
  • Как найти координаты четвертой вершины квадрата
  • Начинающий программист как найти работу