Все о Unicode, UTF8 & наборы символов

Это история, которая уходит корнями в первые дни компьютеров.История имеет сюжет, ну, вроде.Он имеет конкуренции и интриг, а также перемещения куча стран и языков.Существует и урегулирования конфликтов, и happyish финал.Но основное внимание символов — 110116 из них.К концу рассказа, все они будут найти свое уникальное место в этом world.

Эта история (или article, как известно, на Smashing Magazine) будет следовать некоторые из этих персонажей более тесно, как путешествие от веб-сервера для браузера, и обратно.По пути, you’ узнаю больше об истории символов, набор символов, Unicode и UTF-8, и почему знаки вопроса и нечетных акцентированных символов иногда появляются в базах данных и текста files.

Warning: эта статья содержит много номеров, в том числе несколько бинарных – всего подходить, после утренней чашки coffee.

ASCII

Компьютеры дело только в цифрах, а не буквы, так it’ Важно, что все компьютеры, на которых согласятся числа представляют которая letters.

Let’ S сказать, что мой компьютер, используемый номер 1 для A, 2 для B, C 3, и т.д., и ваш использовались 0 для A, 1 для B и т.д. Если я отправил вам сообщение HELLO, то число 8,5, 12, 12, 15 будет свист через провода.Но для вас 8 означает, что я, так что вы будет получать и декодировать его как IFMMP.Чтобы эффективно общаться, мы должны были бы согласиться на стандартный способ кодирования characters.

С этой целью в 1960 Американской ассоциации стандартов созданы в 7-битной кодировке называется Американский стандартный код для обмена информацией ( ASCII).В этой кодировке ПРИВЕТ составляет 72, 69, 76, 76, 79 и будет передаются в цифровом виде, как 1001000 1000101 1001100 1001100 1001111.Использование 7 бит дает 128 возможных значений от 0000000 до 1111111, так ASCII имеет достаточно места для всех строчные и прописные буквы латинского алфавита, вместе с каждым численное цифра, часто используемых знаков препинания, пробелов, символов табуляции и другие управляющие символы.В 1968 году Президент США Линдон Джонсон сделал это official – Все компьютеры должны использовать и понимать ASCII.

Попытка Он Yourself

Есть много ASCII tables в наличии, показывая или описания 128 символов.Или вы можете сделать одну из ваших с немного CSS, HTML и Javascript, большинство из которых, чтобы получить его для отображения красиво:

<html>
<body>
<style type="text/css">p {float: left; padding: 0 15px; margin: 0; font-size: 80%;}</style>
<script type="text/javascript">
for (var i=0; i<128; i++) document.writeln ((i%32?'':'<p>') + i + ': ' + String.fromCharCode (i) + '<br>');
</script>
</body>
</html>

На экране появится таблица вроде этого:

Do-It-Yourself Javascript ASCII table viewed in Firefox Do-It-Yourself Javascript ASCII таблице рассматривается в Firefox

Наиболее важный бит этого JavascriptString.fromCharCode функции.Он принимает число и превращает его в символ.В самом деле, следующие четыре строки HTML и Javascript все тот же результат.Они все получают браузера для отображения символа номера 72, 69, 76, 76 и 79:

HELLO
&#72;&#69;&#76;&#76;&#79;
<script>document.write ("HELLO");</script>
<script>document.write (String.fromCharCode (72,69,76,76,79));</script>

Также обратите внимание, как Firefox отображает непечатные символы (например, возврата и выхода) в первом столбце.Некоторые браузеры показывают пробелы или знаки вопроса.Firefox сжимает четыре шестнадцатеричные цифры в небольшом box.

Восьмой Bit

Teleprinters и котировки акций были вполне довольны отправкой 7 бит информации друг к другу.Но новый новомодные microprocessors 1970-х годов предпочитали работать с полномочиями 2.Они могут обрабатывать 8 бит, в то время, и поэтому использовали 8 бит (так называемый байт или октетов) для хранения каждого символа, давая 256 возможных values.

8 бит персонаж может хранить число до 255, но только ASCII назначает до 127.Другие значения от 128 до 255 запасных.Изначально IBM компьютеров, используемых запасных слота для представления акцентированные буквы, различные символы и формы, и несколько греческих букв.Например, номер 200 был левом нижнем углу окна: ╚, и 224 была греческая альфа буквой в нижнем регистре: α.Этот способ кодирования букв позже получил название код страницы 437.

Однако, в отличие от ASCII, символы 128-255 никогда не были стандартизированы, и различные страны начали использовать запасные слоты для собственных алфавитов.Не все согласились, что 224 должно отображать α, даже не греки.Это привело к созданию нескольких new Код pages.Например, в русском компьютеров IBM с помощью кода страницы 885, 224 представляет кириллическая буква Я.А в греческом 737 страниц кода, это нижний регистр Омега:. ω

Уже тогда возникли разногласия.С 1980-х годов Microsoft Windows представил свою собственную кодовых страниц.В коде страницы кириллицы Windows-1251, 224 представляет кириллическая буква a, и Я находится в 223.

В конце 1990-х годов, попытка стандартизации была сделана.Пятнадцать различных 8 наборов битовых символов были созданы, чтобы охватывать различные алфавиты, такие как кириллица, арабский, иврит, турецкий и тайский.Они называются ISO-8859-1 до ISO-8859-16 (номер 12 был заброшен).В кириллице ISO-8859-5, 224 представляет собой букву р, и Я находится в 207.

Так что если русский друг отправляет вам документ, вы действительно должны знать, что кодовая страница используется.Документ сам по себе всего лишь последовательность чисел.Персонаж 224 может быть Я a или р.Просмотров использует неправильный код страницы, она будет выглядеть как кучкаяичница букв и symbols.

(Ситуация isn’ т так плохо, при просмотре веб-страниц – как веб-браузеры, как правило, обнаружить page’. С набором символов на основе анализа частоты и других подобных методов, но это ложное чувство безопасности – они могути не ошибетесь)

Попытка Он Yourself

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

<html>
<head>
<meta charset="ISO-8859-5">
</head>
<body>
<style type="text/css">p {float: left; padding: 0 15px; margin: 0; font-size: 80%;}</style>
<?php  for ($i=0; $i<256; $i++) echo ($i%32?'':'<p>') . $i . ': ' . chr ($i) . '<br>'; ?>
</body>
</html>

На экране появится таблица вроде этого:

Cyrillic character set ISO-8859-5 viewed in Firefox Кириллица набор символов ISO-8859-5 рассматриваться в Firefox

Функции PHP chr делает подобную вещь, чтобы Javascript’ S String.fromCharCode.Например chr(224) внедряет номер 224 в веб-страницы перед отправкой в ​​браузер.Как we’ видели выше, 224 может означать много разных вещей.Таким образом, браузер должен знать, какой набор символов использовать для отображения 224.That’ ы, что первая линия выше для.Это говорит браузеру использовать набор символов кириллицы ISO-8858-5:

<meta charset="ISO-8859-5">

Если вы исключите charset линию, то она будет отображаться помощью browser’ по умолчанию.В странах с латинской буквы (как в Великобритании и США), это, вероятно, ISO-8859-1, в этом случае 224 является с апостроф: à.Попробуйте изменить эту строку в ISO-8859-7 или Windows-1251 и обновите страницу.Вы также можете изменить набор символов в браузере.В Firefox выберите Вид > кодировку.Переключение между несколькими посмотреть, какой эффект он имеет.Если вы попытаетесь вывести на экран более 256 символов, последовательность будет repeat.

Резюме Circa 1990

Это ситуация, примерно в 1990 году.Документы можно записать, сохранить и обменять на многих языках, но Вы должны знать, какой набор символов они use.Существует также нет простого способа использовать два или более отличных от английского алфавитов в одном документе, и алфавитов с более чем 256 символов, таких как китайский и японский должны использовать совершенно другой systems.

Наконец, в Интернете идет!Интернационализация и глобализация собирается сделать это гораздо более серьезная проблема.Новый стандарт required.

Unicode для Rescue

Начиная с конца 1980-х годов, новый стандарт был предложен — один, что бы присвоить уникальный номер (официально известный как код точки), чтобы каждая буква в каждом языке, которая бы намного больше, чем 256 слотов.Он был назван Unicode.В настоящее время в версии 6.1 и состоит из более чем 110000 пунктов код.Если у вас есть несколько часов, чтобы избавить васможет смотреть их все свист past.

Первые 128 Юникода такие же, как ASCII.Диапазон 128-255 содержит символы валют и другие общие признаки и акцентированных символов (ака символы с диакритические marks), и многие из них заимствованы ISO-8859-1.После 256 есть еще много акцентированных символов.После 880 он попадает в греческих букв, то кириллица, иврит, арабский, индийский скриптов, и тайский.Китайский, японский и корейский начинаются с 11904 и многие другие в between.

Это здорово — не более двусмысленности — каждая буква представлена ​​свой уникальный номер.Кириллица Я Всегда 1071 и греческого α Всегда 945.224 Всегда à, и H еще 72.Отметим, что эти Юникода официально записывается в шестнадцатеричном предшествовала U.Так Unicode код точки H обычно записывается в виде U 0048, а не 72 (конвертировать из шестнадцатеричной в десятичную: 4 * 16 8 = 72)

.

Основной проблемой является то, что существует более 256 из них.Персонажи больше не будут вписываться в 8 бит.Тем не менее Unicode это не набор символов или код page.Таким образом, официально это не Unicode Consortium’ с проблемой.Они просто придумал идею и оставила кого-то другого, чтобы разобраться в реализации.Это будет обсуждаться в ближайшие два sections.

Unicode Внутри Browser

Unicode не укладывается в 8 бит, даже не в 16.Хотя только код 110116 пунктов находятся в использовании, она имеет возможность определить до 1114112 из них, которые требуют 21 bits.

Тем не менее, компьютеры продвинулись с 1970 года.8-битный микропроцессор немного устарел.Новые компьютеры теперь имеют 64-разрядные процессоры, так почему can’ т мы выйти за пределы 8 бит характер и в 32 бит или 64 бит характер

Первый ответ: мы можем

Много программного обеспечения, написанной на С или C, который поддерживает “ Широкий character”.Это 32 бит символа называется wchar_t.Это расширение C’ с 8-битным char типа.Внутренне, современные веб-браузеры используют эти широкие символы (или нечто подобное) и теоретически может вполне счастливо иметь дело с более чем 4 миллиарда различных символов.Это много для Unicode.Так – i nternally, современных браузеров веб-сайтов использовать Unicode.

Попытка Он Yourself

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

<html>
<body>
<style type="text/css">p {float: left; padding: 0 15px; margin: 0; font-size: 80%;}</style>
<script type="text/javascript">
for (var i=0; i<2096; i++)
  document.writeln ((i%256?'':'<p>') + i + ': ' + String.fromCharCode (i) + '<br>');
</script>
</body>
</html>

Это выведет таблицу, как это:

A selection of Unicode code points viewed in Firefox Выбор Unicode кодпунктов рассматривается в Firefox

Скриншоте выше показаны только подмножество первых нескольких тысяч точек кода выхода на Javascript.Выбор включает в себя некоторые кириллицы и арабских символов, отображаемых справа left.

Важным моментом здесь является то, что Javascript полностью работает в веб-браузере, где 32-битные символы, которые идеально подходят.Функция Javascript String.fromCharCode(1071) выводит Unicode точка кода 1071, которая является буквой Я.

Аналогичным образом, если вы положили HTML лица &#1071; в HTML-страницы, современный веб-браузер будет отображать Я.Численное HTML лиц также относятся к Unicode.

С другой стороны, функция PHP chr(1071) будет выводить вперед slash / потому, что chr функции имеет дело только с 8-разрядные числа до 256 и повторяется после этого, и 1071% 6 = 47,была / с 1960s.

UTF-8 в Rescue

Таким образом, если браузеры могут справиться с Unicode в 32-битовых символов, в чем проблема? Проблема заключается в отправке и получении, а также чтение и запись characters.

Проблема остается, потому что:

  1. Много существующего программного обеспечения и протоколов передачи / приема и чтения / записи 8-битный characters
  2. Использование 32 бит для отправки / хранения английский текст будет в четыре раза пропускную способность / пространство required

Хотя браузеры могут справиться с Unicode внутри, вам все равно придется получать данные от веб-сервера для веб-браузера и снова, и вы должны сохранить его в файл или базу данных где-нибудь.Таким образом, вы по-прежнему нужен способ, чтобы сделать 110000 Юникода вписываются в всего в 8 bits.

Там было несколько попыток решить эту проблему, такие как UCS2 и UTF-16.Но победитель в последние годы является UTF-8, которая выступает за универсальный набор символов преобразования Формат 8 bit.

UTF-8 является умным.Он работает немного похож на клавишу Shift на клавиатуре.Обычно, когда вы нажмете H на клавиатуре нижний регистр “ h” появляется на экране.Но если нажать Shift, во-первых, капитал H будет appear.

UTF-8 удовольствия номера 0-127, как ASCII, 192-247, как Shift, ключи и 128-192 в качестве ключевого быть сдвинуты.Например, символы 208 и 209 переложить вас в кириллице диапазоне. 208 следуют 175 есть символ 1071, кириллица Я. точное calculation есть (2082) * 64 (175d) = 1071.Персонажи 224-239 похожи на две смены. 226 следуют 190 и затем 128 характеризуется 12160: ⾀.240 и более является тройным shift.

UTF-8 поэтому многобайтных переменной ширины кодирования.Multi-байт, поскольку один символ, как и Я занимает более одного байта указывать.Переменной ширины, потому что некоторые символы, такие как H сделать только 1 байт, а некоторые до 4.

Лучше всего этообратно совместим с ASCII.В отличие от некоторых других предлагаемых решений, любой документ, написанный только в ASCII, используя только символы 0-127, является вполне допустимым UTF-8, а также – которая экономит полосу пропускания и hassle.

Попытка Он Yourself

Это другой эксперимент.PHP встраивается 6 номеров упомянутых выше в HTML страницу: 72, 208, 175, 226, 190, 128.Браузер интерпретирует эти цифры, как UTF-8, и внутренне преобразует их в Юникода.Тогда Javascript выводит Unicode значения.Попробуйте изменить набор символов из UTF-8 в ISO-8859-1 и посмотреть, что происходит:


Если вы хотите прочитать полностью статью, посетите сайт наших спонсоров

Comments are closed.