Кодовая страница ansi. ASCII — базовая кодировка текста для латиницы

Первая серьёзная проблема, с которой сталкиваются большинство новичков при , связана с набором символов (англ. character set ). Выражается эта проблема с кодировкой в, так называемых, «кракозябриках», которые мы получаем вместо указанных в HTML-файле символов. В данной статье я хочу остановиться на проблеме с кодировкой подробнее, постараться расставить всё по полочкам и дать варианты решения.

  • Что такое кодировка?
  • Кодировка файла (редактирование в Notepad++)
  • Кодировка отображения (просмотр в браузере)
  • Как указать кодировку HTML-страницы? (метатег charset)
  • Всё ещё есть проблема с кодировкой? (header charset в php)

Что такое кодировка?

Условно говоря, каждый символ (знак) состоит из кода и картинки . Здесь код - это уникальный идентификатор символа в наборе символов, который определяется выбранной кодировкой , а картинка - это визуальное представление символа, которое содержится в файле шрифта в соответствующей коду символа ячейке.

Другими словами, кодировка (англ. charset ) - это набор взаимосвязей кодов символов с их визуальными представлениями в шрифте.

Кодировка файла

HTML-страница представляет собой обычный текстовый файл, кодировка которого выбирается при его создании и/или сохранении на запоминающее устройство (жёсткий диск, флэшка и т.д.) .

В случае с Notepad++, кодировка нового документа задаётся в настройках текстового редактора. Выбираем в меню: Опции > Настройки… - и переходим на вкладку «Новый документ ». Здесь нас интересует секция «Кодировка ». По умолчанию, выбрана кодировка ANSI .

Напомню, что это кодировка, в которой будет храниться HTML-файл.

Впрочем, Вы всегда можете преобразовать кодировку HTML-страницы, используя соответствующие функции текстового редактора. Например, в Notepad++ для этого кликните пункт меню «Кодировки » и выберите нужное преобразование.

В данном случае файл был в кодировке ANSI и я преобразовал его в UTF-8 (без BOM) . О том, что такое этот BOM Вы можете прочитать в моей статье: PHP: как удалить BOM в WordPress - проследовав по .

Кодировка отображения

Важно разделять кодировку файла и кодировку отображения . Независимо от того, в какой кодировке хранится файл, он может быть отображен и в любой другой кодировке. Это и является одной из причин проблем с кодировкой.

Например, если Вы сохранили HTML-страницу в кодировке ANSI и откроете её в браузере, вместо русских символов Вы можем получить, так называемые, «кракозябрики».

В данном случае нам надо убедиться, что кодировка файла совпадает с кодировкой отображения файла в браузере. Для этого в Firefox кликните иконку меню, а потом пункт «Кодировка ». Если такого у Вас нет, кликните пункт «Изменить » и добавьте элемент «Кодировка » в меню.

Как вы видите, браузер отображает файл в кодировке «Юникод » (например, UTF-8 ) , в то время как файл был сохранён в кодировке ANSI (например, Windows-1251 ) . Выбрав нужную кодировку, мы получим нужный нам результат.

В случае с Notepad++ также имеется возможность выбора кодировки отображения. Для этого кликните пункт меню «Кодировки », а потом нужный вариант используемой для отображения кодировки.

В данном случае я изменил кодировку отображения ANSI на UTF-8 (без BOM) .

Как указать кодировку HTML-страницы?

И так, мы уже разобрались с тем, что такое кодировка и в чём состоит отличие кодировки файла и кодировки отображения. Теперь нам нужно решить проблему с кодировкой, которая заключается в неправильной интерпретации браузером (или любым другим клиентом) кодировки HTML-страницы.

Почему возникают проблемы с кодировкой? Определить кодировку HTML-страницы не просто, а зачастую и не возможно, т.к. у того же браузера нет информации о ней или она указана неправильно.

Для того чтобы указать кодировку HTML-страницы используется специальный метатег. В HTML5 он имеет следующий урезанный вид:

В данном случае указана кодировка UTF-8 (Юникод) .

В более старых версиях HTML этот метатег имеет следующий вид:

Этот метатег создаёт HTTP-заголовок Content-Type , в котором указывается тип документа text/html и его кодировка Windows-1251 (ANSI) .

Лично я рекомендую использовать именно этот вариант, т.к. с ним будет меньше всего проблем. Главное чтобы такой метатег присутствовал в секции HEAD , и указанная в нём кодировка соответствовала кодировке файла. В большинстве случаев этого будет достаточно.

Всё ещё есть проблема с кодировкой?

В некоторых случаях указать метатег с кодировкой HTML-страницы будет недостаточно. Такая проблема может быть вызвана настройками самого сервера, на котором находится файл HTML-страницы. Дело в том, что сервер способен выдавать свой HTTP-заголовок Content-Type , который будет, условно говоря, иметь приоритет перед метатегом.

В данном случае эту проблему можно решить путём внесения изменений в настройки сервера. Я не буду вдаваться в детали данного вопроса и порекомендую лишь отключать всю эту перекодировку через файл .htaccess , например:

CharsetDisable Off

Также можно производить изменения HTTP-заголовка Content-Type и программными средствами. В том же PHP для этого используется функция header() , например:

header("Content-Type: text/html; charset=UTF-8");

Обращаю Ваше внимание на то, что указание HTTP-заголовков должно идти до вывода какой-то информации на экран, в противном случае Вы получите сообщение об ошибке.

A code page is a character set, which can include numbers, punctuation marks, and other glyphs. Different languages and locales may use different code pages. For example, ANSI code page 1252 is used for English and most European languages; OEM code page 932 is used for Japanese Kanji.

A code page can be represented in a table as a mapping of characters to single-byte values or multibyte values. Many code pages share the ASCII character set for characters in the range 0x00 - 0x7F.

The Microsoft run-time library uses the following types of code pages:

    System-default ANSI code page. By default, at startup the run-time system automatically sets the multibyte code page to the system-default ANSI code page, which is obtained from the operating system. The call:

    Setlocale (LC_ALL, "");

    also sets the locale to the system-default ANSI code page.

    Locale code page. The behavior of a number of run-time routines is dependent on the current locale setting, which includes the locale code page. (For more information, see Locale-Dependent Routines .) By default, all locale-dependent routines in the Microsoft run-time library use the code page that corresponds to the "C" locale. At run-time you can change or query the locale code page in use with a call to setlocale .

    Multibyte code page. The behavior of most of the multibyte-character routines in the run-time library depends on the current multibyte code page setting. By default, these routines use the system-default ANSI code page. At run-time you can query and change the multibyte code page with _getmbcp and _setmbcp , respectively.

    The "C" locale is defined by ANSI to correspond to the locale in which C programs have traditionally executed. The code page for the "C" locale ("C" code page) corresponds to the ASCII character set. For example, in the "C" locale, islower returns true for the values 0x61 - 0x7A only. In another locale, islower may return true for these as well as other values, as defined by that locale.

Исторически сложилось так, что для представления печатных символов (кодирования текста) в первых ЭВМ отвели 7 бит. 2 7 =128. Этого количества вполне хватало для кодирования всех строчных и прописных букв латинского алфавита, десяти цифр и различных знаков и скобок. Именно такой, 7-битной, является таблица символов ASCII (американский стандартный код для обмена информацией), подробную информацию о которой вы можете получить при помощи команды man ascii операционной системы Linux.

Когда возникла необходимость кодировать национальные алфавиты, то 128 символов стало недостаточно. Было решено перейти на кодирование с помощью 8 бит (т. е. одного байта). В результате количество символов, которые можно закодировать таким образом стало равно 2 8 =256. При этом символы национальных алфавитов располагались во второй половине кодовой таблицы, т. е. содержали единицу в старшем разряде байта, отведенного для кодирования символа. Так появился стандарт ISO 8859, содержащий множество кодировок для наиболее распространенных языков.

Среди них была и одна из первых таблиц для кодировки русских букв -- ISO 8859-5 (воспользуйтесь командой man iso_8859_1 для получения кодов русских букв в этой таблице).

Задачи передачи текстовой информации по сети вынудили разработать еще одну кодировку для русских букв, названную Koi8-R (код отображения информации 8-битный, русифицированный). Рассмотрим ситуацию, когда письмо, содержащее русский текст, отправлено по электронной почте. Случалось, что в процессе путешествия по сетям письмо обрабатывалось программой, которая работала с 7-битной кодировкой и обнуляла восьмой бит. В результате такого преобразования код символа уменьшался на 128, превращаясь в код символа латинского алфавита. Возникла необходимость повысить устойчивость передаваемой текстовой информации к обнулению 8 бита.

К счастью, значительное число букв кириллицы имеет фонетические аналоги в латинском алфавите. Например, Ф и F, Р и R. Есть несколько букв, совпадающих даже по начертанию. Расположив русские буквы в кодовой таблице таким образом, чтобы их код превышал код аналогичных латинских на число 128, добились того, что потеря 8-го бита превращала текст хотя и в состоящий из одной латиницы, но все равно понимаемый русскоязычным пользователем.

Так как из всех операционных систем, распространенных в то время, самыми удобными средствами работы с сетью обладали различные клоны операционной системы Unix, то эта кодировка стала фактическим стандартом в этих системах. Таковой она является и сейчас в ОС Linux. И именно эта кодировка чаще всего применяется для обмена почтой и новостями в Интернет.

Далее наступила эра персональных компьютеров и операционной системы MS DOS. Как выяснилось, кодировка Koi8-R для нее не подходила (так же, как и ISO 8859-5), в ее таблице некоторые русские буквы находились на тех местах, которые многие программы предполагали заполненными псевдографикой (горизонтальные и вертикальные черточки, уголки и т. д.). Поэтому была придумана еще одна кодировка кириллицы, в таблице которой русские буквы "обтекали" со всех сторон графические символы. Назвали эту кодировку альтернативной (alt), поскольку она была альтернативой официальному стандарту -- кодировке ISO-8859-5. Неоспоримым достоинством этой кодировки является то, что русские буквы в ней расположены в алфавитном порядке.

После появления ОС Windows от фирмы Microsoft выяснилось, что альтернативная кодировка по некоторым причинам для нее не подходит. Снова передвинув русские буквы в таблице (появилась возможность -- ведь псевдографика в Windows не требуется), получили кодировку Windows 1251 (Win-1251).

Но компьютерные технологии постоянно совершенствуются и в настоящее время все большее число программ начинает поддерживать стандарт Unicode, который позволяет кодировать практически все языки и диалекты жителей Земли.

Итак, в различных ОС предпочтение отдается разным кодировкам. Для того чтобы стало возможным чтение и редактирования текста, набранного в другой кодировке, используются программы перекодирования русского текста. Некоторые текстовые редакторы содержат встроенные перекодировщики, позволяющие читать текст в различных кодировках (Word и др.). Мы для перекодировки файлов будем использовать ряд утилит в ОС Linux, назначение которых ясно из названия: alt2koi, win2koi, koi2win, alt2win, win2alt, koi2alt (откуда, куда, цифра 2 (two) схожа по звучанию с предлогом to, указывающим направление). Эти команды имеют одинаковый синтаксис: команда <входной_файл >выходной_файл.

Пример

Перекодируем текст, набранный в редакторе Edit в среде MS DOS, в кодировку Koi8-R. Для этого выполним команду

alt2koi file1.txt > filenew

Так как в MS DOS и Linux по разному кодируется перевод строки, рекомендуется выполнить еще команду "fromdos":

fromdos filenew > file2.txt

Команда с обратным действием называется "todos" и имеет такой же синтаксис.

Пример

Отсортируем файл List.txt, содержащий список фамилий и подготовленный в кодировке Koi8-R, в алфавитном порядке. Воспользуемся командой sort, которая сортирует текстовый файл по возрастанию или убыванию кодов символов. Если применить ее сразу, то, например, буква В окажется в конце списка, аналогично соответствующей ей букве латинского алфавита V . Вспомнив, что в альтернативной кодировке русские буквы расположены строго по алфавиту, выполним ряд операций: перекодируем текст в альтернативную кодировку, отсортируем его и снова вернем в кодировку Koi8-R. С использованием конвейера команд получаем

koi2alt List.txt | sort | alt2koi > List_Sort.txt

В современных дистрибутивах ОС Linux решены многие проблемы, связанные с локализацией программного обеспечения. В частности утилита sort теперь учитывает особенности кодировки Koi8-R и для сортировки файла в алфавитном порядке достаточно выполнить команду

Алфавит из 256 символов достаточно обширен, чтобы вместить буквы (прописные и строчные) для пары европейских языков, цифры, джентльменский набор знаков пунктуации и ещё кое-что по мелочам.

Но надо учитывать, что человечество изобрело огромное количество значков, которые даже столь большой алфавит не вместит. Даже если нам не потребуется так много знаков в одном тексте, и мы ограничимся только перечисленным выше, возникает проблема: каким образом поставить в соответствие значки из ограниченного набора числам из диапазона 0‥255. Если на одном компьютере буква A кодируется числом 65, а на другом как-нибудь иначе, переданный с одной компьютерной системы на другую текст не будет правильно прочитан.

Требуются стандарты, которые устанавливали бы такое соответствие.

Первый шаг к стандартизации предпринял Американский национальный институт стандартов - ANSI . Выработанный институтом стандарт ASCII - American Standard Code for Information Interchange (американский стандартный код для обмена информацией) заполняет первую половину кодовой таблицы - места от 0 до 127. Заполнение второй половины таблицы данный стандарт не регламентирует. Читать таблицу нужно слева направо сверху вниз. В принципе символов в этой половине кодовой таблицы достаточно для программирования на большинстве алгоритмических языков.


В кодовой странице ASCII отсутствуют не-латинские буквы.

Международная организация по стандартизации ISO предложила несколько стандартов, описывающих варианты заполнения второй половины кодовой таблицы. Например, кодовая страница ISO8859-1 , называемая также в простонародье latin1 , удобна для большинства европейских языков, основанных на латинице.


История кириллических (то есть поддерживающих кириллицу) кодовых страниц сложна. Их общая черта состоит в том, что их первые половины заполнены в соответствии с ASCII , поэтому здесь не приводятся.

Одной из наиболее древних, по-видимому, является KOI8-R , родившаяся в мире ЭВМ под управлением ОС Unix . Довольно странный порядок кириллических букв имеет объяснение. Обратите внимание на то, что для представления символов ASCII достаточно семи бит. Иными словами, все ASCII -символы закодированы при помощи байтов вида 0******* . Установка самого левого, сброшенного бита в таком байте равносильна прибавлению числа 128 к коду. Это прибавление даёт тот же самый эффект, что и наложение верхней половины кодовой таблицы на нижнюю. И наоборот, сбрасывание этого бита сдвигает каждый символ в таблице вверх на 8 строчек.

В старые времена, когда байты были не восьми-, а семибитные (самый левый бит использовался для контроля ошибок при передаче информации между компьютерными системами), символы из нижней половины страницы могли утратить свой заветный левый бит. Кодировка KOI8-R гарантировала, что такой текст останется более-менее читаемым. Например, при порче текста Кодовая страница получится kODOWAQ STRANICA .

У кодовой страницы KOI8-R имеются украинский вариант KOI8-U , а также вариант KOI8-C с дореформенными русскими буквами (ятями, фитами, ижицами), и буквами балканских языков с кириллической графикой.


Кодовая страница CP866 , которую называли ещё альтернативной кодировкой ГОСТ, получила большое распространение в нашей стране на компьютерах под управлением ОС Microsoft DOS . Была также и так называемая основная кодировка ГОСТ, но она так и не получила широкого распространения, так же как и кодировка ISO8859-5 , предложенная организацией ISO для поддержки кириллицы.

У кодировки CP866 уже меньше проблем с алфавитным порядком (если не говорить про многострадальную букву Ёё , и специфические буквы украинского и белорусского алфавитов). Однако имеется досадный разрыв между буквами п и р, заполненный значками для рисования рамок.


Наиболее совершенной кажется кодовая страница CP1251 , предложенная фирмой Microsoft для использования в ОС Microsoft Windows .


Обилие разнообразных кодовых страниц создаёт проблемы при передаче текстов между разными компьютерными системами.

К каждому передаваемому тексту необходимо прилагать сопроводительную информацию об использованной кодовой странице.

Если передающая и принимающая сторона используют разные кодовые страницы, необходимо перекодирование. Такое перекодирование несложно запрограммировать, однако нужно иметь в виду, что не всякие тексты следует перекодировать. К примеру, исполняемые программы не должны перекодироваться, поскольку составляющие их байты не имеют того смысла, что символы в естественном языке (скажем, русском). Эти байты служат кодами команд процессора. То же самое относится к другим типам двоичных файлов: файловым архивам, графическим, аудио- и видеофайлам. Некоторые типы файлов (например, HTML) допускают размещение информации об использованной кодировке внутри этих файлов. Чтобы сохранить состоятельность таких файлов, кроме перекодирования необходимо соответствующим образом исправить эту информацию. Дополнительные трудности возникают, если файлы, подлежащие перекодированию, упакованы в файловый архив. В этом случае принимающей стороне потребуется распаковать архив, перекодировать входящие в него файлы, и затем упаковать обратно. Настоящий кошмар наступает, если имена файлов в архиве тоже нужно перекодировать (это важная причина, по которой следует избегать в именах файлов символов, не входящих в ASCII).

Из-за того, что разные кодировки могут содержать различные наборы символов, процесс перекодирования не всегда корректно определён. Скажем, символ - (длинное тире) имеется в кодовой странице CP1251 и отсутствует в CP866 . Что должно происходить при перекодировании с таким символом?

Наконец, небольшой размер кодовой страницы либо лишает нас возможности использовать в одном тексте всё многообразие символов, придуманных человечеством. Скажем, ни одна из описанных в предыдущем разделе кириллических кодовых страниц не позволит записать такой текст:

* Mueller English-Russian Dictionary computer _n. 1: компьютер; счётно-решающее устройство; электронно-вычислительная машина, ЭВМ; счётчик 2: тот, кто вычисляет

Уродливые, но необходимые

Некоторые компьютерные языки предусматривают уродливые конструкции, позволяющие вставлять в текст ссылки на символы, отсутствующие в кодировке. Например, символьная сущность — в HTML обозначает символ длинного тире (-); макрокоманда \copyright в языке TE X вставляет в документ знак копирайта (©). Такой подход означает, что некоторым символам в соответствующем языке придаётся особый смысл (& в HTML , \ в TE X ). Если потребуется обозначить такой символ как таковой, понадобятся дополнительные ухищрения: & для & , \backslash для \ .

В компьютере вся информация храниться в цифровом виде. Компьютер не понимает больше ничего кроме цифр. Картинки, музыка, видео и текст, программы, игры и даже вирусы для компьютера не что иное, как набор цифр. Цифры и только цифры. При нажатии клавиши на клавиатуре в компьютер попадает цифровой код, соответствующий данной клавише. Так как на клавише нарисованы буквы, цифры или что-то другое, то можно сказать, что определенный цифровой код соответствует определенной букве или символу. При выводе на экран компьютер рисует букву или символ в зависимости от цифрового кода. То есть если цифровой код соответствует букве W, то компьютер её и рисует. Если соответствие символов цифровому коду записать в таблицу, то получим кодовую страницу . Кодовая страница – это таблица, связывающая цифровые (двоичные) коды символов или знаков, используемые приложениями, с клавишами на клавиатуре или с отображением знаков на экране. Кодовые страницы обеспечивают поддержку разных языков. У каждой кодовой страницы существует свой номер. Например, у кодовой страницы для знаков арабского языка номер ср1256, а у кириллицы – ср1251. Обычно можно использовать только одну кодовую страницу в данный момент времени. Если надо сменить язык, то надо менять и кодовую страницу. Это связано с ограниченным объёмом таблицы. Теперь, если текст набирался с использованием одной кодовой страницы (или в одной кодировке), а прочитать его попытаются с использованием другой кодовой страницы (или в другой кодировке), то скорее всего ничего не выйдет, потому что цифровым кодам будут соответствовать совсем другие символы или знаки и совсем не похожие на те первоначальные. В результате мы видим абракадабру или что-то вроде этого. Из всего этого получается простое правило, что читать надо, используя ту же кодовую страницу, что использовалась при вводе читаемого текста . Или использовать программу, которая могла бы перекодировать из одной кодировки в другую. Сейчас это могут делать большинство текстовых редакторов, а например, в обозревателе Microsoft Internet Explorer кодировку можно изменить, щёлкнув правой кнопкой мышки и выбрав пункт – «Кодировка». Для снятия ограничения на количество языковых знаков в кодовой странице консорциумом Unicode был разработан стандарт кодировки знаков, который позволяет представить в одном наборе знаков почти все языки мира. И этот стандарт постепенно начинают использовать все больше и больше.

Языки => Cтандарты кодировки

Многоязыковый/ Юникод/ Прочий набор знаков => UCS-2 little-endian и big-endian, UTF-8, UTF-7 Арабский => Windows 1256, ASMO 708 Китайский (упрощенное письмо) => GB2312, GBK, EUC-CN, ISO-2022-CN, HZ Китайский (традиционное письмо) => BIG5, EUC-TW, ISO-2022-TW Кириллица => Windows 1251, KOI8-R, KOI8-RU, ISO8859-5, DOS 866 Английский/Западноевропейский/Прочий латинский набор знаков => Windows 1250, 1252-1254, 1257, ISO8859-x Греческий => Windows 1253 Иврит => Windows 1255 Японский => Shift-JIS, ISO-2022-JP (JIS), EUC-JP Корейский => Wansung, Johab, ISO-2022-KR, EUC-KR Тайский => Windows 874 Вьетнамский => Windows 1258 Индийские языки => ISCII (Indian Script Code for Information Interchange)




Top