Введение в основы Unicode, взято из нескольких предыдущих постов. В целях представления общей картины я нарисовал широкой кистью — большие области суммированы; гниды не выбраны; волосы не разделены; сопротивление ветра игнорируется.
Unicode = один набор символов плюс несколько кодировок
Unicode — это не одно, а две разные вещи. Первый — это набор символов, а второй — набор кодировок .
- Первый — идея набора символов — не имеет абсолютно никакого отношения к компьютерам.
- Второе — идея кодировки для набора символов Unicode — имеет отношение к компьютерам.
Наборы символов
Идея набора символов не имеет ничего общего с компьютерами. Итак, давайте предположим, что вы британский лингвист, живущий, скажем, в 1750 году. Британская империя расширяется, и европейцы открывают для себя много новых языков, как живых, так и мертвых. Вы давно знакомы с китайскими иероглифами и только что обнаружили шумерские клинописные символы с Ближнего Востока и санскритские символы из Индии.
Пытаясь разобраться с этой огромной массой разных персонажей, вы получите блестящую идею — вы составите нумерованный список каждого персонажа на каждом языке, который когда-либо существовал.
Вы начинаете свой список с вашего собственного знакомого набора английских символов — заглавных и строчных букв, числовых цифр и различных знаков препинания, таких как точка (точка), запятая, восклицательный знак и т. Д. И космический персонаж, конечно.
01 a 02 b 03 c ... 26 z 27 A 28 B ... 52 Z 53 0 54 1 55 2 ... 62 9 63 (space) 64 ? (question mark) 65 , (comma) ... and so on ...
Затем вы добавляете испанские, французские и немецкие символы с тильдами, акцентами и умлаутами. Вы добавляете символы из других живых языков — греческого, японского, китайского, корейского, санскрита, арабского, иврита и так далее. Вы добавляете символы из мертвых алфавитов — ассирийской клинописи — и так далее, пока, наконец, у вас не появится очень длинный список символов.
- То, что вы создали — нумерованный список символов — называется набором символов .
- Числа в списке — числовые идентификаторы символов в наборе символов — называются кодовыми точками .
- И поскольку в ваш список входят все символы, которые когда-либо существовали, вы называете свой набор символов универсальным набором символов .
Поздравляем! Вы только что изобрели (что-то похожее) первую половину Unicode — универсальный набор символов или UCS .
Кодировки
Теперь предположим, что вы прыгаете в свою машину времени и мчитесь вперед к настоящему. Все используют компьютеры. У вас есть блестящая идея. Вы разработаете способ для компьютеров работать с UCS.
Вы знаете, что компьютеры думают в единицах и нулях — битах — и наборах 8 битов — байтов. Итак, вы посмотрите на самое большое число в вашей UCS и спросите себя: сколько байтов мне понадобится для хранения такого большого числа? Ответ, который вы получите — 4 байта, 32 бита. Таким образом, вы выбираете простую и понятную цифровую реализацию UCS — каждое число будет храниться в 4 байтах. Таким образом, вы выбираете кодирование фиксированной длины, в котором каждый символ UCS (кодовая точка) может быть представлен или закодирован точно в 4 байта или 32 бита.
Вкратце, вы разрабатываете кодировку Unicode UCS-4 (универсальный набор символов, 4 байта) , он же UTF-32 (формат преобразования Unicode, 32 бита) .
UTF-8 и кодирование переменной длины
UCS-4 прост и понятен … но неэффективен. Компьютеры отправляют много строк назад и вперед, и многие из этих строк используют только символы ASCII — символы из старого набора символов ASCII. Один байт — восемь битов — более чем достаточно для хранения таких символов. Чрезвычайно неэффективно использовать 4 байта для хранения символа ASCII.
Ключом к решению является помнить, что кодовая точка — это не что иное, как число (целое число). Это может быть короткий или длинный номер, но это только номер. Нам нужен всего один байт для хранения более коротких чисел универсального набора символов, и нам нужно больше байтов только тогда, когда числа становятся длиннее. Таким образом, решение нашей проблемы — это кодирование переменной длины .
В частности, Unicode UTF-8 (Unicode Transformation Format, 8-битный) — это кодирование переменной длины, в котором каждая кодовая точка UCS кодируется с использованием 1, 2, 3 или 4 байтов, по мере необходимости.
В UTF-8, если первый бит байта равен «0», то оставшиеся 7 бит байта содержат один из 128 исходных 7-битных символов ASCII . Если первый бит байта равен «1», то этот байт является первым из множества байтов, используемых для представления кодовой точки, а другие биты байта переносят другую информацию, такую как общее количество байтов — 2 или 3. или 4 байта — которые используются для представления кодовой точки. (Для краткого обзора того, как это работает на битовом уровне, см. Как работает UTF-8 «кодирование с переменной шириной»? )
Просто используйте UTF-8
UTF-8 — отличная технология, поэтому он стал стандартом де-факто для кодирования текста в Юникоде и является наиболее широко используемым кодированием текста в мире. Текстовые строки, которые используют только символы ASCII, могут быть закодированы в UTF-8, используя только один байт на символ, что очень эффективно. И если для символов — например, китайских или японских — требуется несколько байтов, то UTF-8 тоже может это делать.
Порядок следования байтов
Многобайтовые кодировки Unicode фиксированной длины, такие как UTF-16 и UTF-32, хранят кодовые точки UCS (целые числа) в многобайтовых фрагментах — 2-байтовые фрагменты в случае UTF-16 и 4-байтовые фрагменты в случае UTF-32.
К сожалению, разные компьютерные архитектуры — в основном разные процессорные чипы — используют разные методы для хранения таких многобайтовых целых чисел. В компьютерах с прямым порядком байтов «младший» (наименее значимый) байт многобайтового целого числа хранится в крайнем левом углу. «Big-endian» компьютеры делают наоборот; «большой» (самый значимый) байт хранится в крайнем левом положении.
- Компьютеры Intel имеют младший порядок.
- Компьютеры Motorola с прямым порядком байтов.
- Microsoft Windows была разработана на основе архитектуры с прямым порядком байтов — она работает только на компьютерах с прямым порядком байтов или компьютерах, работающих в режиме с прямым порядком байтов — поэтому аппаратное обеспечение Intel и программное обеспечение Microsoft сочетаются друг с другом, как рука и перчатка.
Различия в порядке байтов могут создать проблемы обмена данными между компьютерами. В частности, возможность различий в порядке байтов означает, что если двум компьютерам нужно обмениваться строкой текстовых данных, и эта строка кодируется в многобайтовом кодировании Unicode фиксированной длины, таком как UTF-16 или UTF-32, строка должна начинаться с метки порядка байтов (или спецификации ) — специального символа в начале строки, который указывает на порядковый номер строки.
Строки, закодированные в UTF-8, не требуют спецификации, поэтому в основном эта проблема не возникает для программистов, которые используют только UTF-8.
Ресурсы
- Прагматичный Unicode Неда Бэтчелдера . Настоятельно рекомендуется.
- Абсолютный минимум Каждый разработчик программного обеспечения Абсолютно, положительно должен знать о Юникоде и наборах символов (без извинений!) (2003) Джоэла Спольски — это хорошо, и его много читают, но теперь немного устарели. Я думаю, что это вводит в заблуждение в выдающееся положение, которое он дает спецификации.
- http://en.wikipedia.org/wiki/Unicode
- http://en.wikipedia.org/wiki/Universal_Character_Set
- http://en.wikipedia.org/wiki/ASCII
- http://en.wikipedia.org/wiki/UTF-8
- http://en.wikipedia.org/wiki/Byte_order_mark
- http://docs.python.org/library/codecs.html#encodings-and-unicode