Что это за серая размазня, спросите вы? А вы откройте, откройте. Она только издали размазня. А на самом деле это не размазня, а нулевая плоскость Юникода!
О том, что такое Юникод, зачем он нужен, и как я сделал эту картинку - под катом.
Наверное, вам не надо рассказывать, что вся информация в компьютерах хранится, грубо говоря, в виде чисел. Текст, картинки, видео, игры - всё в числах. Вот именно о тексте и поговорим: в виде каких именно чисел хранятся буквы?
Начнём с начала. Когда Билл Гейтс был маленьким и безобидным, а компьютеры - большими и страшными, был придуман первый стандарт кодировки текста (английского, разумеется; другие языки были не нужны): ASCII. Знакомая аббревиатура? Думаю, вы её где-нибудь уже видели. Так вот, код ASCII (произносится он, кстати, как ass-key, то есть ключ от...) для отображения текста использует семь битов. Это очень удобно: семь битов можно как раз упаковать в один байт, да ещё останется восьмой бит для проверки. Превосходно. Эти вот семь битов образуют ровно 128 комбинаций: вполне достаточно для больших и маленьких букв латинского алфавита, цифр (0-9), всякой дребедени вроде знаков препинания, и разнообразных "контрольных знаков": пробел, переход строки, эскейп и такое прочее.
И всё бы хорошо (настолько хорошо, что до 2007-го года ASCII оставался самой популярной кодировкой в сети), но настало время, когда компьютеры стали достаточно маленькими и безобидными, а Билл Гейтс - большим и страшным, и надо было уже как-то и другие алфавиты изображать! И для этого ASCII ну совсем не годился. Проблему решили достаточно оригинальным (читай, поразительно неуклюжим) способом: появились кодовые страницы.
Что такое кодовая страница? А это очень просто. Берём тот же ASCII и упраздняем этот лишний "проверочный" бит, тем более, что на дворе уже 80-е, и передача сигналов достаточно надёжная, чтобы без него можно было обойтись. Итого, в наличии ещё один бит. Восемь бит - это уже 256 комбинаций. Вполне достаточно, чтобы оставить ASCII (уж английский алфавит, не говоря о цифрах и пробелах-эскейпах, всем нужен!), а в остальные 128 комбинаций напихать кириллицу. Или иврит. Или немецкие умлауты, скажем. Бьюсь об заклад, что с кодовыми страницами вам приходилось сталкиваться не раз; вот скажите, что надо делать, завидев такой текст: "йЮЙ-РН ПЮГ кЕНМЮПД ОПХГМЮЕРЯЪ цЮППХ Б РНЛ, ВРН НМ ЯЛЕПРЕКЭМН ХЯОСЦЮМ"? Верно, нужно переключить кодировку в браузере. Это вам (да и мне, вообще-то) приходится делать, потому что есть куча способов впихнуть кириллицу в эти самые 128 комбинаций, и как-то так получилось, что одного стандарта нет, а есть Windows-1251, KOI8-R, KOI8-U и ещё, сдаётся мне, парочка разных страниц. Так что решение это путаное, да ещё есть у него и другой недостаток.
128 комбинаций. Для кириллицы хватит. Для иврита хватит. Даже для вьетнамского. А что делать китайцам, у которых 40+ тысяч иероглифов? Нарезать всё это богатство на кусочки по 128 и использовать триста кодовых страниц? Да ещё, небось, менять страницу с каждым иероглифом? Да так любой компьютер свихнётся, хоть он и железный. И вообще, если надо несколько алфавитов использовать сразу, а не только английский + ещё один, кодовые страницы не годятся. Можно, конечно, менять их туда-сюда, но это такая головная боль...
И поэтому светлые головы (сами посмотрите в Википедии, кто и когда, ладно?) почесали в светлых затылках, подумали и наконец-то начали раccуждать логически: чем изображать разные знаки одними и теми же 128-ю числами, почему бы не просто дать каждому знаку своё собственное число в личное пользование? Так и родился стандарт Unicode. Конечно, есть у Юникода и недостаток: если каждому знаку своё число давать, то это нифига себе много чисел надо! В последней, пятой, версии стандарта предусмотрены 107 тысяч (!) знаков. Естественно, одного байта тут ну совсем не хватит. Нужно до четырёх байтов, а следовательно, текст может весить в четыре раза больше. Но в наш-то век терабайтовых дисков, не всё ли равно?
Поговорим немного о структуре Юникода. Как я говорил, в последней его версии даётся место для ста семи тысяч знаков. Но это только "занятые" числа; на самом деле, стандарт предусматривает аж 1,114,112 чисел: места хватит всем, даже толкиновские руны и пляшущих человечков можно туда же воткнуть. Для удобства эти числа делятся на 17 кусков по 65,536 (это число вообще хорошее, потому что это 2 в 16-й степени, или просто 256*256). Эти куски называются "плоскостями", уж не спрашивайте почему. Вернёмся к картинке в начале поста (помните её ещё?). На ней изображена первая (точнее, нулевая) плоскость Юникода. Эту плоскость называют Основной Многоязычной Плоскостью: Basic Multilingual Plane. В ней находятся самые распространённые знаки: латиница (кстати, на тех числах, что и в ASCII, на всякий случай), кириллица, знаки препинания (естественно), всякие другие алфавиты и несколько десятков тысяч самых распространённых китайских иероглифов. Это очень удобно: в пределах одной плоскости для каждого знака нужно не четыре байта, а два. Не один, конечно, но и то хорошо. Поэтому обычно можно и двумя байтами пользоваться (а то и одним, если писать только латиницей), а если уж позарез нужен какой-нибудь экзотический иероглиф, то можно покинуть нулевую плоскость. Ведь правда просто?
Всё, устал я уже писать, а уж как вы устали читать, лучше и думать не буду. Расскажу только вкратце, как я получил эту картинку.
Я всегда хотел сделать себе постер с Юникодом. И, в принципе, в этом мало сложного: на официальном сайте
www.unicode.org можно скачать хоть весь Юникод (правда, только маленькими кусочками, а не одной картинищей), и потом сшить из него что угодно; хоть постер, хоть обои. Но это много возни, много времени... и самое главное, 107,000 знаков это просто слишком много, Мерлин побери. У меня стен не хватит, чтобы всё это повесить. Поэтому от планов пришлось отказаться...
Но недавно я нашёл ссылку на сайт некого Roman Czyborra, который сделал шрифт для отображения почти всей нулевой плоскости. Кстати, полного шрифта для всего Юникода нет. Вы представьте, сколько времени нужно, чтобы сделать в одном стиле 107 тысяч знаков! В общем, увидев этот шрифт, я загорелся идеей распечатать только его. Всё-таки, 65,536 знаков это уже не так много, да и знаки можно маленькими сделать. Скачал шрифт. И обнаружил, что выполнен он в очень странном формате, и просто так в Ворд загрузить его нельзя. В общем, повозился я дня три, и написал программу, которая взяла файл со шрифтом, пожевала его и выдала эту картинку: 256 на 256 знаков нулевой плоскости Юникода. Happy End.
Но распечатывать я её не буду: издали она действительно выглядит как серая размазня.