Кодиране с UTF-8

Историята с кодовете не е нова. Сетете се и за маймуницата в субтитрите на плейъра ви, която идва, да ви каже, че не сте си променили локалните настройки за езика на Bulgarian. За да не стигаме до такива бедствия и в работата по нашите уеб проекти, ще опитаме да изясним как се ползва кодирането с UTF-8. 🙂

utf-8

Въпросът е, че няма такова нещо като „просто текст“. Операционните системи днес съхраняват всичко, което сме написали, със съответна схема на кодиране към него. Какво ще рече кодиране? Означава, че всеки байт информация зад нашия текст е свързан с определена знакова стойност. Стойностите са подредени в таблица и тази таблица се ползва, за да могат и други програми за разчитат и разбират написаното.

Всичко тръгва от телеграфите, които започват да изпращат кодирана информация. Знаем за Морзовия код – той представя всяка буква като поредица от точки и тирета. Мислете за компютърните кодировки по подобен начин, само дето там всичко накрая се свежда до нули и единици.

Защо е важна кодировката? 

Да повторим отново: кодирането спомага за това компютрите, комуникационната техника и разни други устройства, които ползват текст, да могат да разбират текста по еднакъв начин.

Кратка история на ASCII таблицата 

Без ASCII нямаше да се стигне и до UTF-8. Затова сега малко история.

Въпросното ASCII е американският кодов стандарт за информационен обмен. Създаден е през 1963 г. от Комитета към Асоциацията по американски стандарт (ASA). През 1969 г. името на агенцията се променя на Институт по американски национални стандарти (ANSI), както е известен и до днес.

Поредицата кодове в ASCII се получава при пренареждане и разширяване на набора от символи и знаци, използвани в телеграфията по това време от компанията на Bell. Първоначално е включвал само главни букви и цифри, но през 1967 г. са добавени малки букви и някои контролни знаци. По този начин се стига до това, което днес познаваме като US-ASCII, т.е. знаците от 0 до 127. Това е набор от общо 128 знака, определени през 1967 г. като стандарт. Съдържат всичко необходимо за писане на английски език.

C0 Controls and Basic Latin 

128

През 1981 г. компанията IBM разработва разширение на 8-битовия ASCII код, наречен „кодова страница 437“. В тази версия на кода някои остарели контролни знаци са заменени с графични. Добавени са също още 128 знака: нови символи, знаци, графики и латински букви, както и всички пунктуационни и други знаци, необходими при писане на текстове и на други езици, като напр. испански. По този начин наборът от ASCII знаците се разширява до 256 знака общо. Съответно, IBM включва поддръжка на тази кодова страница в хардуера на своя модел 5150, познат като IBM-PC, смятан за първия персонален компютър. Операционната система на този модел, MS-DOS, също използва разширения ASCII код.

ASCII-256-part1

ASCII-256-part2

Поява на Unicode стандарта за кодиране

До 2007 г. ASCII е най-използваната таблица за кодови знаци, но възможностите й все пак са доста ограничени. Има много други азбуки освен английската и за тях се създават съответно отделни таблици. Общият проблем сред традиционните кодировки е, че позволяват работа на компютъра с два езика, не повече. Обикновено се ползват латинските знаци и тези на местния език.

Появява се нуждата от установяване на консистентност в кодирането. Това се постига чрез компютърния стандарт Unicode, зад който стои Unicode Consortium. Консорциумът има за задача „развитието, поддържането и разпространението на международни софтуерни стандарти и информация, в частност Уникод стандарта, който определя представянето на текста във всички съвременни софтуерни продукти и стандарти“.

Имплементацията на Unicode стандарта се прави чрез различни кодировки, сред които най-използвани са UTF-8, UTF-16 и вече остарялата UCS-2. По идея, Unicode кодира знаците в основата: графемите и графемо-подобните единици, а не различните глифове (интерпретации) на знаците. При китайските знаци понякога се стига дори до противоречия при опита да се разграничат знаците в основата от съответстващите им най-различни глифове.

При обработката на текста Unicode осигурява уникален кодов указател. Това е номер, а не глиф, за всеки един знак. По този начин знакът се представя по абстрактен начин, а за всичко, свързано с визуалната интерпретация (размер, форма, шрифт, стил), отговаря софтуерът (уеб браузър или текстов редактор).

От ASCII към UTF-8 

Кодировката UTF-8 е представена за пръв път на 2. септември 1992 г. Към момента се използва от над 50% от уеб страниците.

UTF-8 е дело на Ken Thompson, създател на операционната система Unix и програмния език В (пряк предшественик на С). Таблицата UTF-8 съвпада в първите си 128 кода с ASCII, за да има приемственост. Позициите от 0 до 127 съдържат еднобайтови кодове. Останалите позиции обаче се представят с последователности от множество байтове: състоят се от един водещ байт и един или повече следващи байтове.

Следващите 1920 кода от UTF-8 заемат по два байта за своето кодиране. Представят се със съответни числови стойности (кодови указатели), които указват към съответни знаци. Това позволява да се включат знаците на почти всички азбуки, производни на латинската. Също гръцката, кирилската, коптската, арменската, еврейската, арабската, сирийската и таанската азбука, заедно с диакритични знаци. По три байта заемат останалата част от знаците в основната мултиезична група. Кодовите указатели на Unicode поначало са разделени на 17 групи, всеки с по 216 указателя.

bytes-in-sequence-binary

По четири байта отнема кодирането в UTF-8 на знаците от останалите групи на Unicode, които включват китайски, японски и корейски знаци, както и различни исторически записи и математически символи.

Първоначалната спецификация на таблицата стига до 31-битови числа, но през ноември 2003 г. UTF-8 е ограничена до U+10FFFF, което е крайният знак в нея. Причината е, че трябва да се съобрази с ограниченията на UTF-16. Премахват се всички 5- и 6-байтови последователности, както и около половината от 4-байтовите.

Кой налага UTF-8

Днес имаме свободата да избираме кодировъчна схема, в която да си съхраняваме файловете. Но ако искаме и други програми да разчитат лесно написаното от нас, е по-добре да се придържаме към стандартните кодировки.

UTF-8 кодировката става все по-важна в интернет пространството, по няколко причини:

  • IETF изисква всички нови интернет протоколи да поддържат UTF-8 и UTF-8 все повече се използва за представяне на специални знаци по уеб страниците, вместо на именувани единици или някакви други неща

IETF (Internet Engineering Task Force) се грижи за разработването и налагането на уеб стандартите. Работи в тясно сътрудничество с W3C (World Wide Web Consortium) и ISO/IEC и се занимава в частност със стандартите на Набора от интернет протоколи (TCP/IP).

  • IMC (Internet Mail Consortium) препоръчва всички e-mail програми да представят и създават мейли чрез UTF-8
  • UTF-8 все повече се използва като знакова кодировка по подразбиране за операционните системи, програмните езици, API-тата и софтуерните приложения.

Като недостатък на UTF-8 се посочва по-големият размер на файла при използването на знаци, изискващи 3 или 4 байта за запис в паметта. В такива случаи други кодировки биха спестили повече място.

Разликите между UTF-8 и UTF-8 without BOM 

Когато създаваме уеб проект, дори съвсем прост, също се съобразяваме с кодировката на файловете. За HTML5 страниците задаваме UTF-8, според препоръката на w3schools. Записваме го като <meta charset=“UTF-8″ />. Това е сред първите неща, които включваме в HTML кода, но освен там, е важно да го отбележим и в редактора, който използваме при писането. Ако ползвате например Notepad++, може да направите това от менюто Encoding > Encode in UTF-8 without BOM.

Какво е UTF-8 without BOM и защо не избираме стандартното UTF-8?

UTF-8 with BOM 

Кодировка UTF-8 ще рече UTF-8 with BOM. UTF-8 с включен BOM е последователност от байтове (EF BB BF), която позволява на четящия да идентифицира файла като UTF-8 файл. 

Unicode стандартът нито изисква, нито препоръчва използване на BOM:

2.6 Encoding Schemes

Use of a BOM is neither required nor recommended for UTF-8, but may be encounter in contexts where UTF-8 data is converted from other encoding forms that use a BOM or where the BOM is used as a UTF-8 signature.

И всичко щеше да е чудесно, ако не бяха проблемите с кирилицата… което е достатъчна причина все пак да запазваме файлоте си в UTF-8 с включен BOM. Понеже не е особено радващо да четеш въпросителни вместо букви…

Какво изобщо е BOM? Това е съкращение за Byte Order Mark и с него се обозначава подредбата по битове (endianness) на обем данни (текст), както са съхранени в паметта на компютъра. Но тази подредба не е от значение при UTF-8. Символен низ, написан на UTF-8 with BOM, започва със следните байтове: EF BB BF, но тези байтове се игнорират, когато се извлича записът от файла. Поради това, вместо UTF-8 се задава използването на UTF-8 без BOM.

В заключение

Как използваме UTF-8, когато създваме файлове за уеб?

  1. Съхраняваме файл(овете) в кодировка UTF-8 (въпреки препоръката да се запазват without BOM)
  2. Декларираме <meta charset=“UTF-8″ /> за HTML5 или съответно <meta http-equiv=“content-type“ content=“text/html; charset=UTF-8″ /> за HTML4 документите
  3. Уеб сървърът задължително трябва да обслужва файловете ви в кодировка UTF-8 

Важно е да се има предвид, че Apache сървърите са конфигурирани да ползват по подразбиране кодировка ISO-8895-1, поради което в .htaccess файла се добавя следният ред:

AddDefaultCharset UTF-8

.

Advertisements

One response to “Кодиране с UTF-8

Вашият коментар

Попълнете полетата по-долу или кликнете върху икона, за да влезете:

WordPress.com лого

You are commenting using your WordPress.com account. Log Out / Промяна )

Twitter picture

You are commenting using your Twitter account. Log Out / Промяна )

Facebook photo

You are commenting using your Facebook account. Log Out / Промяна )

Google+ photo

You are commenting using your Google+ account. Log Out / Промяна )

Connecting to %s