JavaRush /Java блог /Random UA /Кодування тексту ASCII (Windows 1251, CP866, KOI8-R) та Ю...
articles
15 рівень

Кодування тексту ASCII (Windows 1251, CP866, KOI8-R) та Юнікод (UTF 8, 16, 32) - як виправити проблему з кракозябрами

Стаття з групи Random UA
Сьогодні ми поговоримо про те, звідки беруться кракозябри на сайті та у програмах, які кодування тексту існують та які з них слід використовувати. Докладно розглянемо історію їх розвитку, починаючи з базової ASCII, а також її розширених версій CP866, KOI8-R, Windows 1251 та закінчуючи сучасними кодуваннями консорціуму Юнікод UTF 16 та 8. Зміст Кодування тексту ASCII (Windows 1251, CP866, KOI8-R) та Юнікод (UTF 8, 16, 32) — як виправити проблему з кракозябрами.: Комусь ці відомості можуть здатися зайвими, але знали б ви, скільки мені приходить питань саме кракозябрів (нечитаного набору символів). Тепер я матиму можливість відсилати всіх до тексту цієї статті та самостійно відшукувати свої косяки. Ну що ж, приготуйтеся вбирати інформацію і постарайтеся стежити за перебігом розповіді.

ASCII - базове кодування тексту для латиниці

Розвиток кодувань текстів відбувався одночасно з формуванням галузі IT, і вони за цей час встигли зазнати чималих змін. Історично все починалося з досить-таки неблагозвучної в російській вимові EBCDIC, яка дозволяла кодувати літери латинського алфавіту, арабські цифри та знаки пунктуації з символами, що управляють. Але все ж таки відправною точкою для розвитку сучасних кодувань текстів варто вважати знамениту ASCII(American Standard Code for Information Interchange, яка російською мовою зазвичай вимовляється як «аски»). Вона описує перші 128 символів з найбільш часто використовуваних англомовними користувачами - латинські літери, арабські цифри та розділові знаки. Ще в ці 128 знаків, описаних в ASCII, потрапляли деякі службові символи на кшталт дужок, грат, зірочок тощо. Власне, ви самі можете побачити їх: Кодування тексту ASCII (Windows 1251, CP866, KOI8-R) та Юнікод (UTF 8, 16, 32) - як виправити проблему з кракозябрами - 2Саме ці 128 символів з первісного варіанта ASCII стали стандартом, і в будь-якому іншому кодуванні ви їх обов'язково зустрінете і вони стоятимуть саме в такому порядку. Але справа в тому, що за допомогою одного байта інформації можна закодувати не 128, а цілих 256 різних значень (двійка в вісім рівня дорівнює 256), тому слідом за базовою версією Аски з'явився цілий рядрозширених кодувань ASCII , у яких можна було крім 128 основних знаків закодувати ще й символи національного кодування (наприклад, російського). Тут, напевно, варто ще трохи сказати про системи числення, які використовуються при описі. По-перше, як ви всі знаєте, комп'ютер працює тільки з числами в двійковій системі, а саме з нулями та одиницями («бульова алгебра», якщо хтось проходив в інституті або в школі). Один байт складається з восьми біт, кожен з яких є двійкою в ступеню, починаючи з нульової, і до двійки в сьомий: Кодування тексту ASCII (Windows 1251, CP866, KOI8-R) та Юнікод (UTF 8, 16, 32) - як виправити проблему з кракозябрами - 3 Не важко зрозуміти, що всіх можливих комбінацій нулів і одиниць у такій конструкції може бути лише 256. Переводити число з двійкової системи до десяткової досить просто. Потрібно просто скласти всі ступені двійки, над якими стоять одиниці. У нашому прикладі це виходить 1 (2 в ступені нуль) плюс 8 (два в ступені 3), плюс 32 (двійка в п'ятому ступені), плюс 64 (в шостий), плюс 128 (в сьомий). Разом виходить 233 у десятковій системі числення. Як бачите, все дуже просто. Але якщо ви придивитеся до таблиці із символами ASCII, то побачите, що вони представлені у шістнадцятковому кодуванні. Наприклад, «зірочка» відповідає в Аскі шістнадцятковому числу 2A. Напевно, вам відомо, що в шістнадцятковій системі числення використовуються, крім арабських цифр, ще й латинські літери від A (означає десять) до F (означає п'ятнадцять). Ну так ось,переведення двійкового числа в шістнадцяткове вдаються до наступного простого способу. Кожен байт інформації розбивають на частини по чотири біта. Тобто. у кожній половинці байта двійковим кодом можна закодувати лише шістнадцять значень (два в четвертому ступені), що можна легко уявити шістнадцятковим числом. Причому в лівій половині байта вважати ступеня потрібно буде знову з нульової, а не так, як показано на скріншоті. В результаті ми отримаємо, що на скріншоті закодовано число E9. Сподіваюся, що перебіг моїх міркувань і розгадка цієї ребуса вам зрозуміли. Ну, а тепер продовжимо, власне, говорити про кодування тексту.

Розширені версії Аскі - кодування CP866 та KOI8-R із псевдографікою

Отже, ми з вами почали говорити про ASCII, яка була відправною точкою для розвитку всіх сучасних кодувань (Windows 1251, юнікод, UTF 8). Спочатку в неї було закладено лише 128 знаків латинського алфавіту, арабських цифр та ще чогось там, але в розширеній версії з'явилася можливість використати всі 256 значень, які можна закодувати в одному байті інформації. Тобто. з'явилася можливість додати до Аски символи літер своєї мови. Тут треба буде ще раз відволіктися, щоб пояснити — навіщо взагалі потрібні кодування текстіві чому це так важливо. Символи на екрані вашого комп'ютера формуються на основі двох речей - наборів векторних форм (уявлень) усіляких знаків (вони знаходяться у файлух зі шрифтами, які встановлені на вашому комп'ютері) та коду, який дозволяє висмикнути з цього набору векторних форм (файлу шрифту) саме той символ, який необхідно вставити в потрібне місце. Зрозуміло, що за векторні форми відповідають шрифти, а ось за кодування відповідає операційна система і програми, що використовуються в ній. Тобто. будь-який текст на вашому комп'ютері буде набір байтів, у кожному з яких закодований один єдиний символ цього самого тексту. Програма, що відображає цей текст на екрані (текстовий редактор, браузер тощо), при розборі коду зчитує кодування чергового знака і шукає відповідну векторну форму в потрібному файлі шрифту, який підключений для відображення даного текстового документа. Все просто та банально. Отже, щоб закодувати будь-який потрібний нам символ (наприклад, з національного алфавіту), потрібно виконати дві умови: векторна форма цього знака повинна бути у шрифті, що використовується, і цей символ можна було б закодувати в розширених кодуваннях ASCII в один байт. Тому таких варіантів існує ціла купа. Лише для кодування символів російської існує кілька різновидів розширеної Аски. Наприклад, спочатку з'явилася потрібно виконати дві умови: векторна форма цього знака повинна бути у шрифті, що використовується, і цей символ можна було б закодувати в розширених кодуваннях ASCII в один байт. Тому таких варіантів існує ціла купа. Лише для кодування символів російської існує кілька різновидів розширеної Аски. Наприклад, спочатку з'явилася потрібно виконати дві умови: векторна форма цього знака повинна бути у шрифті, що використовується, і цей символ можна було б закодувати в розширених кодуваннях ASCII в один байт. Тому таких варіантів існує ціла купа. Лише для кодування символів російської існує кілька різновидів розширеної Аски. Наприклад, спочатку з'явиласяCP866 , де була можливість використовувати символи російського алфавіту, і вона була розширеною версією ASCII. Тобто, її верхня частина повністю збігалася з базовою версією Аскі (128 символів латиниці, цифр і ще всякої лабуди), яка представлена ​​на наведеному трохи вище скріншоті, а ось уже нижня частина таблиці з кодуванням CP866 мала вказаний на скріншоті трохи нижче вигляд і дозволяла закодувати ще 128 знаків (російські літери та всяка там псевдографіка): Кодування тексту ASCII (Windows 1251, CP866, KOI8-R) та Юнікод (UTF 8, 16, 32) - як виправити проблему з кракозябрами - 4 Бачите, правому стовпчику цифри починаються з 8, т.к. числа з 0 до 7 відносяться до базової частини ASCII (див. перший скріншот). Таким чином, у кирабочної літери «М» у CP866 буде код 9С (вона знаходиться на перетині відповідних рядка з 9 і стовпця з цифрою С у шістнадцятковій системі числення), який можна записати в одному байті інформації, та за наявності відповідного шрифту з російськими символами ця літера без проблем з'явиться в тексті. Звідки взялася така кількість псевдографіки у CP866? Тут річ у тому, що це кодування для російського тексту розроблялася ще ті волохаті року, коли графічні операційні системи були поширені як тепер. А в Досі і подібних до неї текстових операційних системах псевдографіка дозволяла хоч якось урізноманітнити оформлення текстів і тому нею рясніє CP866 і всі інші її ровесниці з розряду розширених версій Аскі. CP866 поширювала компанія IBM, але крім цього для символів російської мови було розроблено ще ряд кодувань, наприклад, до того ж типу (розширених ASCII) можна віднести KOI8-R : Кодування тексту ASCII (Windows 1251, CP866, KOI8-R) та Юнікод (UTF 8, 16, 32) - як виправити проблему з кракозябрами - 5Принцип її роботи залишився той самий, що й у описаної трохи раніше CP866 - кожен символ тексту кодується одним єдиним байтом. На скріншоті показано другу половину таблиці KOI8-R, т.к. перша половина повністю відповідає базовій Аскі, яка показана на першому скріншоті у цій статті. Серед особливостей кодування KOI8-R можна відзначити те, що кирабоці в її таблиці йдуть не в алфавітному порядку, як це зробабо в CP866. Якщо подивіться на перший скріншот (базовій частині, яка входить у всі розширені кодування), то зауважте, що в KOI8-R російські літери розташовані в тих же осередках таблиці, що і співзвучні ним літери латинського алфавіту з першої частини таблиці. Це було зроблено для зручності переходу з російських символів на латинські шляхом відкидання всього одного біта (два в сьомому ступені або 128).

Windows 1251 - сучасна версія ASCII і чому вилазять кракозябри

Подальший розвиток кодувань тексту було пов'язано з тим, що набирали популярності графічні операційні системи та необхідність використання псевдографіки в них з часом зникла. В результаті виникла ціла група, яка за своєю суттю, як і раніше, були розширеними версіями Аскі (один символ тексту кодується лише одним байтом інформації), але вже без використання символів псевдографіки. Вони належали до так званих ANSI кодувань, розроблених американським інститутом стандартизації. У просторіччя ще використовувалася назва кирабоця для варіанта з підтримкою російської мови. Прикладом такої може бути Windows 1251. Вона вигідно відрізнялася від використовуваних раніше CP866 і KOI8-R тим, що місце символів псевдографіки в ній зайняли символи російської друкарні (крім знака наголосу), а також символи, що використовуються в близьких до російської слов'янських мовах (українській, білоруській і т.д.). ): Кодування тексту ASCII (Windows 1251, CP866, KOI8-R) та Юнікод (UTF 8, 16, 32) - як виправити проблему з кракозябрами - 6Через таку велику кількість кодувань російської мови, у виробників шрифтів і виробників програмного забезпечення постійно виникав головний біль, а у нас з вам, шановні читачі, часто вилазабо ті самі горезвісні кракозябри, коли відбувалася плутанина з версією, що використовується в тексті. Дуже часто вони вилазабо при надсиланні та отриманні повідомлень електронною поштою, що спричинило створення дуже складних перекодувальних таблиць, які, власне, вирішити цю проблему докорінно не змогли, і найчастіше користувачі для листування використовували трансліт латинських літер, щоб уникнути горезвісних кракозябрів при використання російських кодувань подібних до CP866, KOI8-R або Windows 1251. По суті, кракозябри, що вилазять замість російського тексту, були результатом некоректного використання кодування даної мови, яка не відповідала тій, в якій було закодовано текстове повідомлення спочатку. Допустимо, якщо символи, закодовані за допомогою CP866, спробувати відобразити, використовуючи кодову таблицю Windows 1251, Кодування тексту ASCII (Windows 1251, CP866, KOI8-R) та Юнікод (UTF 8, 16, 32) - як виправити проблему з кракозябрами - 7Аналогічна ситуація дуже часто виникає при створенні та налаштуванні сайтів, форумів або блогів, коли текст з російськими символами помилково зберігається не в тому кодуванні, яке використовується на сайті за замовчуванням, або ж не в тому текстовому редакторі, який додає в код відсеб'ятину не видиму неозброєним оком. Зрештою така ситуація з безліччю кодувань і кракозябрами, що постійно вилазять, багатьом набридла, з'явабося передумови до створення нової універсальної варіації, яка б замінила собою всі існуючі і вирішила б проблему з появою не читаних текстів. Крім цього існувала проблема мов подібних до китайської, де символів мови було набагато більше, ніж 256.

Юнікод (Unicode) - універсальні кодування UTF 8, 16 і 32

Ці тисячі знаків мовної групи південно-східної Азії неможливо було описати в одному байті інформації, що виділявся для кодування символів у розширених версіях ASCII. В результаті було створено консорціум під назвою Юнікод (Unicode - Unicode Consortium) при співпраці багатьох лідерів IT індустрії (ті, хто виробляє софт, хто кодує залізо, хто створює шрифти), які були зацікавлені у появі універсального кодування тексту. Першою варіацією, що вийшла під егідою консорціуму Юнікод, була UTF 32. Цифра у назві кодування означає кількість біт, яка використовується для кодування одного символу. 32 біти складають 4 байти інформації, які знадобляться для кодування одного єдиного знака в новому універсальному кодуванні UTF. Внаслідок чого один і той же файл з текстом, закодований у розширеній версії ASCII та в UTF-32, в останньому випадку матиме розмір (важити) у чотири рази більше. Це погано, але тепер у нас з'явилася можливість закодувати за допомогою ЮТФ число знаків, що дорівнює двом у тридцять другому ступені ( мільярди символів) ., які накриють будь-яке реально необхідне значення з колосальним запасом). Але багатьом країнам з мовами європейської групи така величезна кількість знаків використовувати в кодуванні зовсім і не було необхідності, проте при задіянні UTF-32 вони ні за що ні про що отримували чотириразове збільшення ваги текстових документів, а в результаті збільшення обсягу інтернет-трафіку і обсягу даних, що зберігаються. Це багато, і таке марнотратство собі ніхто не міг дозволити. Внаслідок розвитку Юнікоду з'явилася UTF-16, Яка вийшла настільки вдалою, що була прийнята за умовчанням як базовий простір для всіх символів, які у нас використовуються. Вона використовує два байти для кодування одного знака. Давайте подивимося, як це діло виглядає. У операційній системі Windows ви можете пройти шляхом «Пуск» — «Програми» — «Стандартні» — «Службові» — «Таблиця символів». В результаті відкриється таблиця з векторними формами всіх встановлених у вас системі шрифтів. Якщо ви виберете в «Додаткових параметрах» набір знаків Юнікод, зможете побачити для кожного шрифту окремо весь асортимент символів, що входять до нього. До речі, клацнувши по будь-якому з них, ви зможете побачити його двобайтовий код у форматі UTF-16 , що складається з чотирьох шістнадцяткових цифр: Кодування тексту ASCII (Windows 1251, CP866, KOI8-R) та Юнікод (UTF 8, 16, 32) - як виправити проблему з кракозябрами - 8Скільки символів можна закодувати в UTF-16 за допомогою 16 бітів? 65536 (два в ступені шістнадцять), і саме це число було прийнято за базовий простір в Юнікод. Крім цього, існують способи закодувати за допомогою неї і близько двох мільйонів знаків, але обмежабося розширеним простором у мільйон символів тексту. Але навіть ця вдала версія кодування Юнікоду не принесла особливого задоволення тим, хто писав, припустимо, програми лише англійською мовою, бо у них після переходу від розширеної версії ASCII до UTF-16 вага документів збільшувалася вдвічі (один байт на один символ) в Аскі і два байти на той самий символ у ЮТФ-16). Саме для задоволення всіх і вся в консорціумі Unicode було вирішено придумати кодуваннязмінної довжини. Її назвали UTF-8. Попри вісімку у назві, вона справді має змінну довжину, тобто. кожен символ тексту може бути закодований у послідовність завдовжки від одного до шести байт. На практиці ж у UTF-8 використовується лише діапазон від одного до чотирьох байт, тому що за чотирма байтами коду нічого вже навіть теоретично неможливо уявити. Всі латинські знаки в ній кодуються в один байт, так само як і в старій добрій ASCII. Що примітно, у разі кодування тільки латиниці, навіть програми, які не розуміють Юнікод, все одно прочитають те, що закодовано в ЮТФ-8. Тобто базова частина Аски просто перейшла в це дітище консорціуму Unicode. Кирилічні знаки в UTF-8 кодуються в два байти, а, наприклад, грузинські - в три байти.шрифтах існує єдиний кодовий простір . І тепер їх виробникам залишається лише виходячи зі своїх сил та можливостей заповнювати його векторними формами символів тексту. У наведеній вище «Таблиці символів» видно, що різні шрифти підтримують різну кількість знаків. Деякі насичені символами Юнікод шрифти можуть важити дуже пристойно. Але тепер вони відрізняються не тим, що вони створені для різних кодувань, а тим, що виробник шрифту заповнив або не заповнив єдиний кодовий простір тими чи іншими векторними формами до кінця.

Кракозябри замість російських букв - як виправити

Давайте тепер подивимося, як з'являються замість тексту кракозябри, або, як вибирається правильне кодування для російського тексту. Власне, вона задається в тій програмі, в якій ви створюєте або редагуєте цей текст, або код з використанням текстових фрагментів. Для редагування та створення текстових файлів особисто я використовую дуже хороший, на мій погляд, Html та PHP редактор Notepad++ . Втім, він може підсвічувати синтаксис ще добра сотні мов програмування та розмітки, а також має можливість розширення за допомогою плагінів. Читайте докладний огляд цієї чудової програми за посиланням. У верхньому меню Notepad++ є пункт «Кодіювання», де у вас буде можливість перетворити вже наявний варіант на той, який використовується на вашому сайті за замовчуванням: Кодування тексту ASCII (Windows 1251, CP866, KOI8-R) та Юнікод (UTF 8, 16, 32) - як виправити проблему з кракозябрами - 9У випадку сайту на Joomla 1.5 і вище, а також у разі блогу на WordPress слід, щоб уникнути появи кракозябрів, вибирати варіант UTF 8 без BOM . А що таке приставка BOM? Справа в тому, що коли розробляли кодування ЮТФ-16, навіщось вирішабо прикрутити до неї таку річ, як можливість записувати код символу як у прямій послідовності (наприклад, 0A15), так і в зворотній (150A). А для того, щоб програми розуміли, в якій послідовності читати коди, і був придуманий BOM(Byte Order Mark або, іншими словами, сигнатура), яка виражалася в додаванні трьох додаткових байтів на початок документів. У кодуванні UTF-8 ніяких BOM передбачено в консорціумі Юнікод не було і тому додавання сигнатури (цих найбільш горезвісних додаткових трьох байтів на початок документа) деяким програмам просто заважає читати код. Тому ми завжди при збереженні файлів у ЮТФ маємо вибирати варіант без BOM (без сигнатури). Таким чином, ви заздалегідь убезпечите себе від вилазу кракозябрів. Що примітно, деякі програми в Windows не вміють цього робити (не вміють зберігати текст у ЮТФ-8 без BOM), наприклад, той самий горезвісний Блокнот Windows. Він зберігає документ у UTF-8, але все одно додає на його початок сигнатуру (три додаткові байти). Причому ці байти завжди будуть одні й ті самі — читати код у прямій послідовності. Але на серверах через цю дрібницю може виникнути проблема — вилізуть кракозябри. Тому в жодному разі не користуйтеся звичайним блокнотом Windowsдля редагування документів вашого сайту, якщо не бажаєте появи кракозябрів. Кращим і найпростішим варіантом я вважаю вже згаданий редактор Notepad++, який практично не має недоліків і складається з одних переваг. У Notepad ++ при виборі кодування у вас буде можливість перетворити текст на кодування UCS-2, яке за своєю суттю дуже близьке до стандарту Юнікод. Також у Нотепад можна буде закодувати текст в ANSI, тобто. Щодо російської мови це буде вже описана нами трохи вище за Windows 1251. Звідки береться ця інформація? Вона прописана в реєстрі вашої операційної системи Windows - яке кодування вибирати у випадку ANSI, яке вибирати у випадку OEM (для російської мови це буде CP866). Якщо ви встановите на своєму комп'ютері іншу мову за промовчанням, то й ці кодування будуть замінені на аналогічні з розряду ANSI або OEM для тієї самої мови. Після того, як ви в Notepad++ збережете документ у потрібному вам кодуванні або відкриєте документ із сайту для редагування, то в правому нижньому кутку редактора зможете побачити її назву: Кодування тексту ASCII (Windows 1251, CP866, KOI8-R) та Юнікод (UTF 8, 16, 32) - як виправити проблему з кракозябрами - 10Щоб уникнути кракозябрів , крім описаних вище дій, буде корисним прописати в його шапці вихідного коду всіх сторінок сайту інформацію про це саме кодування, щоб на сервері або локальному хості не виникло плутанини. Взагалі, у всіх мовах гіпертекстової розмітки, крім Html, використовується спеціальне оголошення xml, в якому вказується кодування тексту.
<?xml version="1.0" encoding="windows-1251"?>
Перш ніж розпочати розбирати код, браузер дізнається, яка версія використовується і як саме потрібно інтерпретувати коди символів цієї мови. Але що примітно, якщо ви зберігаєте документ у прийнятому за умовчанням юнікод, це оголошення xml можна буде опустити (кодування буде вважатися UTF-8, якщо немає BOM або ЮТФ-16, якщо BOM є). У разі документа мови Html для вказівки кодування використовується елемент Meta , який прописується між відкриваючим та закриваючим тегом Head:
<head>
...
<meta charset="utf-8">
...
</head>
Цей запис досить сильно відрізняється від прийнятої в стандарті Html 4.01, але повністю відповідає стандарту Html 5, і вона буде повністю правильно зрозуміла будь-якими браузерами, що використовуються на даний момент. По ідеї елемент Meta із вказівкою кодування Html документа краще буде ставити якомога вище в шапці документа , щоб на момент зустрічі в тексті першого знака не з базової ANSI (які правильно прочитаються завжди і в будь-якій варіації) браузер вже повинен мати інформацію про те, як інтерпретувати коди цих знаків. Посилання на першоджерело: Кодування тексту ASCII (Windows 1251, CP866, KOI8-R) та Юнікод (UTF 8, 16, 32) - як виправити проблему з кракозябрами
Коментарі
ЩОБ ПОДИВИТИСЯ ВСІ КОМЕНТАРІ АБО ЗАЛИШИТИ КОМЕНТАР,
ПЕРЕЙДІТЬ В ПОВНУ ВЕРСІЮ