WDH Про кодування символів
Національні кодування
Визначення
Почнемо з визначення понять. Сучасні комп'ютери зберігають всю інформацію у вигляді двійкових байтів, тобто 8-бітових одиниць, здатних набувати значення від 0 до 255. Для того, щоб зберегти в пам'яті комп'ютера не числову, а текстову інформацію, ми повинні визначити, яким байтом чи байтами кодуватиметься кожен символ, який може зустрітися в нашому тексті. Така відповідність між символами і байтами, що кодують їх, і називається кодуванням символів (character set). Неважко зрозуміти, по-перше, що кожне кодування розробляється для конкретної людської мови (точніше, для конкретної писемності), і, по-друге, для будь-якої мови таких кодувань можна придумати скільки завгодно. Знаючи людську натуру, неважко здогадатися і про те, що вигадають їх набагато більше, ніж потрібно. Звичайно, так і сталося: найбільш розвинена на сьогодні бібліотека функцій перекодування ICU (International Components for Unicode) корпорації IBM підтримує понад 170 різних кодувань.
Кодування латиниці
Розглянемо докладніше кодування тих писемностей, з якими найчастіше стикається український розробник, тобто латиниці та кирилиці. Для латиниці на сьогодні використовуються два основні кодування: ASCII та EBCDIC. ASCII (American Standard Code for Information Interchange) - це семибітна кодова таблиця (коди символів 00 - 7F або 0 - 127 десяткові), що стала стандартом для малих та середніх комп'ютерів, а тому і стандартом для Інтернету. У ній байти з шістнадцятковими кодами 00 1F і 7F використовуються для кодування керуючих (не відображаються) символів, а інші кодують наступні символи:

Кодування EBCDIC (Extended Binary-Coded Decimal InterchangeCode) - це восьмибітна кодування (коди символів 00 - FF або 0 - 255 десяткові), прийнята на всіх комп'ютерах IBM, крім PC. Можна було б її не згадувати, але з розвитком XML як основного формату транспорту даних у Мережі ми все частіше стикатимемося з XML-файлами, згенерованими на великих машинах. Тут байти з кодами 00 3F кодують керуючі символи, а інші використовуються так:

Кодування кирилиці
Кодування «нелатинських» алфавітних писемностей влаштовано так. Вони кодуються восьмибітовою таблицею (1 байт = 1 символ), тобто числами 00 - FF (0 - 255 десяткові) так, що молодша половина кодової таблиці (коди 00 - 7F або 0 - 127 десяткові) збігається з ASCII, а старша половина (коди 80 - FF або 128 - 255 десяткові) містить національне кодування, тобто українські літери в українських кодових таблицях, турецькі в турецьких і т. д. Така організація національних кодових таблиць дозволяє правильно відображати та обробляти латинські літери, цифри та розділові знаки на будь-якому комп'ютері, незалежно від його системних налаштувань. Саме так, зокрема, влаштовані й українські кодові таблиці, тож ми можемо надалі розглядати лише старшу їхню половину.
Історія українських кодувань – це приклад плутанини, рідкісної навіть для нашої комп'ютерної дійсності. Радянські стандартизуючі організації приймали ГОСТи, виробники комп'ютерів (Apple) та операційних систем (Microsoft) їх дружно ігнорували та вводили власні кодування. В результаті ми отримали спадщину з чотирьох різних ГОСТів, два кодування від Microsoft (для DOS і для Windows) та кодування від Apple для Mac'ів (усі, звичайно, несумісні між собою). Подробиці, що цікавляться, можуть звернутися до сторінки The Cyrillic CharsetSoup.
На щастя, сьогодні немає потреби докладно описувати всі ці кодування, оскільки в Рунеті вижили лише два з них. Перша – це КОІ8-Р (КОІ означає Код для Обміну та обробки Інформації, Р відрізняє українську кодову таблицю від української, КОІ8-У). КОІ8-Р була зареєстрована Андрієм Черновим з Релкому як RFC 1489 і має вигляд:

КОІ8-Р є стандартом de facto для всіх онлайнових служб, крім WWW. Зокрема, всі служби електронної пошти та новин Рунету працюють у цьому кодуванні. Що стосується Інтернету, то тут ситуація складніша. Справа в тому, що більше 90% клієнтських комп'ютерів Мережі працює під керуванням Windows різних версій. Windows використовує власне кодування українських літер, яке прийнято назвати за номером кодової сторінки Windows-1251 або CP1251:

Двобайтове кодування
Не слід думати, що це національні кодування є байтовими, т. е. дотримуються правила: 1 символ = 1 байт . Насправді це справедливо тільки для алфавітних (літерно-звукових) систем писемності. З іншого боку, існують силабічні системи письма, в яких кожен символ є не звуком, а складом, наприклад, індійськими і далекосхідними складовими абетками. Оскільки складів у мові набагато більше, ніж окремих звуків, старших 128 байтів кодової таблиці просто замало їхнього представлення. Це призводить до того, що такі писемності використовують двобайтові кодування (DBCS, Double Byte Character Sets). Типовим прикладом такого кодування є японське кодування JIS, що існує в кількох варіантах. Вона охоплює латинські літери та цифри, обидві японські складові абетки (катакану та хірагану) та найважливіші з китайських ієрогліфів. Але повноцінне уявлення ієрогліфічної писемності Китаю, Японії таКореї, яка налічує кілька тисяч ієрогліфів, у рамках національних кодувань залишається неможливим.
Недоліки національних кодувань
Безперечною перевагою традиційних кодових таблиць є гранична стислість подання текстової інформації. Однак, ця стислість тягне за собою і кілька недоліків, органічно з нею пов'язаних:
- Оскільки символи різних мов видаються одними й тими самими значеннями від 0 до 255, то правильної їх візуалізації виконуюча система повинна знати як код символу, а й назва кодової таблиці. При цьому, незважаючи на всі зусилля стандартизаторів, різнобій у назві кодувань повний (наприклад, ASCII може називатися ANSI_X3.4-1968, ANSI_X3.4-1986, cp367, csASCII, IBM367, iso-ir-6, ISO646-US, ISO_646). irv:1991, ascii, us, us-ascii, us-ascii-1968, x-ansi, синоніми для інших кодувань див. у WDH: Стандартні кодування символів).
- З цієї причини виявляється практично неможливим поєднання кількох кодових таблиць у одному документі. Це веде до «типографської бідності» текстових документів, оскільки величезна кількість корисних символів, що не входять до цього національного кодування, викидається за борт.
- Кодові таблиці, орієнтовані на алфавітні системи письма, не змогли вирішити проблему кодування далекосхідних ієрогліфів та індійських складових абеток. До речі, це означає, що майже половина населення Землі позбавлена можливості працювати з комп'ютером рідною мовою.
У міру того, як комп'ютери ставали потужнішими, Інтернет розгалуженішим, а операційні системи дружелюбнішими до користувача, перелічені недоліки виявлялися все більш серйозною перешкодою на шляху до створення природних інтерфейсів «людина-комп'ютер» і «комп'ютер-Мережа". Вихід із ситуації було досягнуто створенням стандарту Unicode, про який йтиметься на наступній сторінці.