Кодировка анси. Кодовые страницы или почему текст иногда нельзя прочитать

Исторически сложилось так, что для представления печатных символов (кодирования текста) в первых ЭВМ отвели 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 и для сортировки файла в алфавитном порядке достаточно выполнить команду

Индикатор текущего языка ввода находится на панели задач справа (символы Enобозначают английский язык,Uk– украинский иRu– русский). Изменить язык ввода можно, щелкнув левой кнопкой мыши по индикатору. В появившемся затем меню следует щелкнуть левой кнопкой мыши по строке нужного языка. Кроме того, при установке или настройкеWindowsможно выбрать комбинацию клавиш для изменения языка ввода (либолевый Alt + Shift , либоCtrl + Shift ).

Для кодирования текстовых данных в Windowsиспользуются три основные кодировки:

    кодировка OEM;

    кодировка ANSI;

    кодировка Unicode.

В режиме командной строки в Windowsиспользуется кодовая таблица ASCII (American Standard Code for Information Interchange), разработанная ANSI (American National Standard Institute – Американский национальный институт стандартов). Первая половина таблицы (символы с десятичными кодами от 0 до 127) содержит те символы, которые можно ввести с клавиатуры (точнее с ее символьной зоны). Во второй половине кодовой таблицы (символы с десятичными кодами от 128 до 255) содержатся в основном общепринятые математические и так называемые псевдографические символы (например, "" или ""), использовавшиеся в текстовом режиме для рисования линий и диаграмм.

Однако многие алфавиты используют буквы, отличные от 26 латинских букв, заданных в первой половине кодовой таблицы ASCII. Поэтому были разработаны кодовые страницы и для этих языков. Каждой такой кодовой странице присвоен числовой номер. Так, кодовые страницы с номерами 850 и 852 используются для западноевропейских языков, а кодовая страница 866 – для русского и украинского языков. В этой кодировке символы кириллицы имеют следующие коды:А-Я – 128-159 ("80 " - "9 F "),а-п – 160-175 ("A 0 " - "AF "),р-я – 224-239 ("E 0 " - "EF "), Ё – 240 ("F 0 "), ё – 241 ("F 1 "),Є – 240 ("F 2 "),є – 241 ("F 3 "), Ї – 240 ("F 4 "),ї – 241 ("F 5 "),т.е. расположены на тех позициях, где в кодировкеASCIIнаходятся относительно редко используемые символы национальных алфавитов и греческие буквы. Для украинских буквІ и і в этой кодировке используются соответствующие латинские буквы с кодами 73 ("49 ") и 105 ("69 ").

В терминологии Windows кодировка ASCII называется кодировкой OEM (Original Equipment Manufacturer – производитель оригинального оборудования).

Кодировка ANSI является «родной» кодировкойWindowsи была разработана специально для этой операционной системы. Первая половина кодовой таблицы содержит те же символы, что и первая половина кодовой таблицы кодировкиASCII(OEM), т.е. текст на английском языке в обеих кодировках будет выглядеть одинаково. Во второй половине кодовой таблицыANSIтакже размещаются буквы национальных алфавитов. Кодовая страницаWindowsдля западноевропейских алфавитов имеет номер 1252, а для языков, использующих буквы кириллицы (в том числе, для русского и украинского языков) – номер 1251. Следует отметить, что коды одних и тех же букв русского и украинского языка в кодовой странице 866 и в кодовой страницеWindows-1251 не совпадают. Так, буквыА -Я имеют коды 192-223 ("C 0 " - "DF "),а -я – 224-255 ("E 0 " - "FF "),Ё – 168 ("A 8 "), ё – 184 ("B 8 "),Є – 170 ("AA "),є – 186 ("BA "), Ї – 175 ("AF "),ї – 191 ("BF "),І – 178 ("B 2 "),і – 179 ("B 3 "), Ґ – 165 ("A 5 "), ґ – 180 ("B 4 ").

В кодировке Unicode на каждый символ отводится два байта. Так, коды букв латинского алфавитаA -Z иa -z в шестнадцатеричном представлении лежат соответственно в диапазонах "0041 " - "005 A " и "0061 " - "007 A ". Коды букв русского алфавитаА -Я иа -я лежат соответственно в диапазонах "0410 " - "042 F " и "0430 " - "044 F ". Исключением являются буквыЁ иё , коды которых имеют значения "0401 " и "0451 ". Буквы украинского алфавита, совпадающие с русскими буквами, имеют те же коды, что и соответствующие русские буквы, а буквыЄ , І , Ї , є , і , ї , Ґ и ґ имеют соответственно коды "0404 ", "0406 ", "0407 ", "0454 ", "0456 ", "0457 ", "0490 " и "0491 ".

Существует несколько разновидностей представления символов в кодировке Unicode. Самой распространенной являетсякодировка UTF -16 , в которой каждый символ представлен двумя байтами, причем в процессоре и в памяти компьютера младший байт ("00 " для латинских букв или "04 " – для букв кириллицы) размещается вторым, а старший – первым, т.е. букваА будет представлена как "1004 ". Такое представление называют такжеUTF -16 Little Endian (младший байт в конце). Это представление используется в процессорах фирмыIntelи часто называют форматомIntel.

В кодировке UTF -16 Big Endian (старший байт в конце) первым идет младший байт, вторым – старший, т.е. букваА будет представлена как "0410 ". Такое представление данных используется в процессорахMotorolaиPowerPCи, соответственно, в компьютерах фирмыApple, использующих эти процессоры (в последнее время появились компьютерыAppleна основе процессоров фирмыIntel).

Формат UTF-8 предназначен для сокращения объема вводимых и выводимых данных. Данные в этом формате представляются по следующему алгоритму:

    символы Unicodeв диапазоне "0000 " - "007 F " (первые 128 символов) записываются одним байтом (старший байт отбрасывается);

    символы Unicodeв диапазоне "0080 " - "07 FF " (охватывающем буквы наиболее распространенных национальных алфавитов) записываются двумя байтами следующим образом: символUnicodeс двоичной кодировкой00000 xxxxxyyyyyy (гдеx иy 0 или1 ) преобразуется к виду110 xxxxx 10 yyyyyy ;

    символы Unicodeв диапазоне "0800 " - "FFFF " записываются тремя байтами следующим образом: символUnicodeс двоичной кодировкойxxxxyyyyyyzzzzzz (гдеx ,y иz 0 или1 ) преобразуется к виду1110 xxxx 10 yyyyyy 10 zzzzzz .

Для того, чтобы текстовый редактор мог определить, какая из кодировок Unicodeиспользована для содержимого, в самом начале файла помещается символметки порядка байт BOM (ByteOrderMark). Это либо символ "FFFE " (для кодировкиUTF-16), либо символ "FEFF " (для кодировкиUnicodeBigEndian), либо символ "EFBBBF " (для кодировкиUTF-8).

Для представления букв русского и украинского алфавитов существуют также другие кодировки:

    кодировка Unix (кодовая страница KOI8-R для русского языка и отдельная кодовая страница для украинского языка, иногда называемая KOI8-U);

    кодировка Apple Macintosh (кодовая страница MacCyrillic);

    международная кодировка кириллицы ISO8859-5 (относительная кодировка символов в этой кодировке соответствует кодировке Unicode).

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

Редактор Блокнотпозволяет открывать, просматривать и редактировать текст во всех трех кодировках (OEM,ANSIилиUnicode), однако для этого необходимо установить соответствующий шрифт с помощью командыШрифтменюФормат. Для кодировкиOEMустанавливается шрифтTerminal , а для кодировокANSIилиUnicodeможно установить любой шрифт типаTrueType (со значком) илиOpenType (со значком), например,Times New Roman ,Arial ,Verdana илиCourier New .

Текстовый файл в кодировке OEM, открытый в редактореБлокнот, можно сохранить только в этой кодировке. Текст в кодировкеANSIилиUnicodeможно сохранить в одной из следующих кодировок:ANSI,UTF-16,UTF-16BigEndianиUTF-8. Для этого в диалоговом окне командыСохранить какменюФайлнеобходимо выбрать соответствующее значение в полеКодировка:ANSI ,Юникод ,Юникод Big Endian илиUTF -8 . По умолчанию текст в редактореБлокнотсохраняется в кодировкеANSI.

Редактор Блокнотне позволяет производить преобразование содержимого файла из кодировкиOEMв кодировкуANSI, а также выполнять обратное преобразование. Для этого можно использовать либо использовать командную оболочкуFar , либо воспользоваться редакторомWord(эта возможность будет рассмотрена в лабораторной работе 1-07).

В командной оболочке Farнадо сначала щелкнуть мышью по наименованию файла в кодировкеOEMи нажать клавишуF 4 (редактирование файла). В окне редактора помощью клавишCtrl +A выделяется содержимое всего файла, а затем с помощью клавишCtrl +C содержимое файла копируется в буфер обмена. Выход из редактора выполняется с помощью клавишиEsc .

После этого с помощью команды

copy con имя-файла . txt

создается новый файл, в котором сразу нажимается клавиша F 6 и клавишаEnter .Если имя файла содержит пробелы, его необходимо заключить в двойные кавычки .

Затем открывается (с помощью клавиши F 4 ) полученный пустой файл и в нем с помощью переключателяF 8 устанавливается кодировкаWindows(значение режима кодировке в первой строке редактора должно бытьWin ) и содержимое буфера обмена копируется в файл с помощью клавишCtrl +V . Содержимое файла в редакторе сохраняется с помощью клавишиF 2 .

Иногда необходимо просмотреть содержимое файла непосредственно в шестнадцатеричном виде, при этом каждый байт представляется двумя шестнадцатеричными цифрами. Такую возможность предоставляют многие командные оболочки (например, FarилиTotal Commander). Кроме того, существует целый класс текстовых редакторов, называемыхHEX -редакторами , специально предназначенных для просмотра и изменения содержимого файлов, дисков и оперативной памяти.

Для просмотра содержимого текстового файла в Farщелкните мышью по наименованию файла и нажмите клавишуF 3 (просмотр файла). Для вывода содержимого в шестнадцатеричном виде нажмите затем клавишуF 4 (эта клавиша переключает режим просмотра с текстового на шестнадцатеричный и обратно).

В компьютере вся информация храниться в цифровом виде. Компьютер не понимает больше ничего кроме цифр. Картинки, музыка, видео и текст, программы, игры и даже вирусы для компьютера не что иное, как набор цифр. Цифры и только цифры. При нажатии клавиши на клавиатуре в компьютер попадает цифровой код, соответствующий данной клавише. Так как на клавише нарисованы буквы, цифры или что-то другое, то можно сказать, что определенный цифровой код соответствует определенной букве или символу. При выводе на экран компьютер рисует букву или символ в зависимости от цифрового кода. То есть если цифровой код соответствует букве 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)

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.



Есть вопросы?

Сообщить об опечатке

Текст, который будет отправлен нашим редакторам: