Історія виникнення

Кодування являє собою таблицю символів, де кожній букві алфавіту (а також цифр і спеціальних знаків) привласнений свій унікальний номер — код символу.

Стандартизована тільки половина таблиці, т. зв. ascii-код — перші 128 символів, які включають в себе літери латинського алфавіту. І з ними ніколи не буває проблем. Друга ж половина таблиці (а всього в ній 256 символів — за кількістю станів, який може прийняти один байт) віддана під національні символи, і в кожній країні ця частина різна. Але тільки в Росії примудрилися придумати цілих 5 різних кодувань. Термін «різні» вказує на те, що одного й того ж символу відповідає різний цифровий код. Тобто якщо ми неправильно визначимо кодування тексту, то нашій увазі постане абсолютно нечитаний текст.

Кодування з’явилися історично. Перша широко використовується російська кодування називалася koi-8. Її придумали, коли адаптували до російської мови систему unix. Це було ще в сімдесятих — до появи персоналок. І досі в unix це вважається основним кодуванням.

Потім з’явилися перші персональні комп’ютери, і почався переможний хід dos. Замість того, щоб скористатися вже придуманої кодуванням, microsoft вирішила зробити свою, ні з чим не сумісну. Так з’явилася dos-кодування (або кодова сторінка 866). У ній, до речі, були введені спеціальні символи для малювання рамок, що широко використовувалося в програмах, написаних під dos. Наприклад, в тому ж norton commander-е.

Паралельно з ibm-сумісними розвивалися і macintosh комп’ютери. Незважаючи на те, що їх частка в Росії дуже мала, проте потреба в русифікації існувала і, зрозуміло, була придумана ще одна кодування — mac.

Час минав, і 1990 році microsoft явила на світ першу успішну версію windows 3.0-3.11. А разом з нею і підтримку національних мов. І знову був проведений такий же фокус, як і з dos. З незрозумілих причин вони не підтримали жодну з вже існуючих раніше (як це зробила os/2, яка прийняла за стандарт dos-кодування), а запропонували нову win-кодування (або кодова сторінка 1251). Де-факто вона стала найпоширенішою в Росії.

І, нарешті, п’ятий варіант кодування пов’язаний вже не з конкретною фірмою, а зі спробами стандартизації кодувань на рівні всієї планети. Займалася цим iso — міжнародна організація по стандартах. І, здогадайтеся, що вони зробили з російською мовою? Замість того, щоб прийняти за «стандартну російську» яку-небудь з вищеописаних, вони придумали ще одну (!) і назвали її довгим неоковирним поєднанням iso-8859-5. Зрозуміло, вона теж виявилася ні з чим не сумісною. І зараз ця кодування практично ніде не застосовується. Здається, її використовують тільки в базі даних oracle. Принаймні я ні разу не бачив текст в цьому кодуванні. Тим не менш, її підтримка присутня у всіх броузерах.

Зараз йде робота над створенням нової універсальної кодування unicode), в якій передбачається в одну кодову таблицю запхнути всі мови світу. Тоді точно проблем не буде. Для цього на кожен символ відвели 2 байти. Таким чином, максимальна кількість символів у таблиці розширилося до 65535. Але до моменту, коли всі перейдуть на unicode, залишається ще дуже багато часу.

web-дизайн і кодування

А тепер про те, як всі ці кодування пов’язані з web-дизайном. Проблема полягає в web-серверах, так і в броузерах. Обидві складові повинні спілкуватися однією мовою та в одному кодуванні, і тільки в цьому випадку броузер буде розуміти те, що йому посилає сервер.

З боку сервера ми повинні встановити систему, яка вміє попередньо посилати повідомлення про те, в якому кодуванні буде надіслана сторінка. А броузер це повідомлення повинен прийняти і, відповідно, налаштуватися на потрібну відображення. Якщо все зроблено правильно, то проблем не виникає. Але дійсність вносить свої корективи і неправильне налаштування web-сервера може призвести до того, що, надіславши повідомлення про те, що зараз буде сторінка в кодуванні win-1251, сервер надсилає її в koi-8. Зрозуміло, броузер плутається, адже він не в змозі самостійно визначити кодування сторінки. Він лише користується вказівками сервера і, відповідно, показує сторінку неправильно.

Є спосіб вказати кодування сторінки не на сервері, а безпосередньо в html-коді. Для цього використовується спеціальна версія meta-тега з параметром charset, задає потрібну мову. Наприклад, для сторінки, написаній у кодуванні win1251, відповідний код буде виглядати так:

Але, на жаль, з цим тегом пов’язано кілька проблем. В Росії дуже поширений спосіб, при якому web-сервер автоматично визначає, в якому кодуванні приходить запит від клієнта і віддає сторінку web-броузеру вже перекодированной. Ось тут нас і чекає невеликий підводний камінь. meta-тег може зіграти поганий жарт. Справа в тому, що вказівки на сторінці мають пріоритет порівняно з командами, присылаемыми web-сервером і, правильно перекодувавши сторінку, сервер, тим не менш, не може змінити вміст тега meta. Відбувається розбіжність реальної кодування, в якій прийшла сторінка, і вказівками в тегу meta. Таку сторінку можна буде нормально переглянути і перекодувати засобами броузера. Вибір кодування вручну в даному випадку не допоможе, оскільки тег meta має пріоритет над установками броузера. Єдиний спосіб зробити це — зберегти сторінку і видалити злощасний тег.

У зв’язку з усіма цими проблемами в РУНЕТ-е не рекомендується застосовувати даний тег взагалі. У такому разі перегляд буде здійснюватися в тій кодуванні, на яку налаштований броузер, якщо сервер пришле повідомлення про кодування документа. У разі розбіжності її можна досить легко переключити. Крім того, якщо за замовчуванням виставляти кодування win-1251, то в 95% Ваших відвідувачів сторінка відразу ж буде показана правильно.

Проблеми з таблицями стилів

Останнім часом у зв’язку з широким розповсюдженням dhtml, css і 4-х версій браузерів виникла нова проблема, пов’язана з кодуваннями. Та причиною її появи є використання каскадних таблиць стилів (css).

Як відомо, css дозволяє нам поставити конкретний шрифт, який буде використовуватися для відображення тексту. І, начебто, ми можемо користуватися абсолютно будь-яким шрифтом, і від цього захоплює дух. Але проблема полягає в тому, що шрифти беруться з набору, встановленого на комп’ютері відвідувача, а зовсім не у Вас. І саме Ваш набір шрифтів зовсім не зобов’язаний бути в інших. Як правило, його там і немає.

Що ж робити? Невже не можна користуватися різними шрифтами? Можна! Але з рядом обмежень і розумінням того факту, що навіть при цих обмеженнях у деяких людей Ваша сторінка не буде проглядатися.

Які ж ці обмеження?

Перше і основне, полягає в тому, щоб використовувати тільки стандартні шрифти, що поставляються з windows і гарантовано знаходяться на машині клієнта. А цих шрифтів, як відомо, всього три. Ось їх список: «arial», «times new roman», «courier».

А друге — коректне опис шрифту в таблиці стилів і перерахування в списку також і інших шрифтів. В кінці списку повинно бути обов’язкове зазначення загального сімейства шрифту (з зарубками, без зарубок, моноширинний тощо). За допомогою такого опису ми збільшуємо потенційну аудиторію нашого сайту. Приклад коректного опису шрифтів в таблиці стилів показаний нижче.

Чому ж не можна використовувати інші шрифти? Тому що в цьому випадку відсутній шрифт буде підмінений найближчим відповідним за замовчуванням. Для зменшення ймовірності цього ми і використовуємо в css список шрифтів. Але ще гірше, якщо шрифт буде на комп’ютері, але виявиться нерусифицированной версією. У цьому випадку текст буде відображений якимись спецсимволів з набору знаків центральної Європи — всілякі знаки з умляутами, апострофами, тильдами і т. п.

З усього вищесказаного випливає висновок — зі шрифтами треба працювати обережно. І досі багато чисто текстових написів відливається в gif. Ситуація не зміниться до тих пір, поки шрифт можна буде завантажувати на клієнтську машину, подібно до того, як це відбувається з картинкою. Насправді така технологія вже є і реалізована, наприклад, в 4-му internet explorer. Але вона ще дуже сира і, що найголовніше, шрифт повинен бути представлений в спеціальному форматі. Будемо сподіватися, що в майбутньому це стане стандартом, а поки потрібно з обережністю користуватися шрифтами, відливаючи рідкісні в графіку і використовуючи css тільки стандартні.