15:19 Кодировки и наборы символов ASCII | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
Набор символов или кодировка (character set, charset) - это определённая таблица кодирования конечного множества символов. Кодовая страница (code page) - это однобайтная (8-битная) кодировка. Кодировка ASCII (American Standard Code for Information Interchange - "аски", с ударением на первом слоге) - это 7-битная (128 символов) кодировка для представления латинского алфавита, десятичных цифр, некоторых знаков препинания, арифметических операций и управляющих символов. В 8-битных национальных кодировках нижнюю половину кодовой таблицы (0 - 127) занимают символы ASCII, а верхнюю (128 - 255) - другие нужные символы. В Юникоде первые 128 символов тоже совпадают с соответствующими символами ASCII. Символы ASCII (в шестнадцатеричном представлении):
Управляющие символы и их шестнадцатеричные коды:
Кодировка Windows-1251 (cp1251) является стандартной 8-битной кодировкой для всех русских версий Microsoft Windows. Первая часть таблицы кодировки (латиница) полностью соответствует кодировке ASCII. Вторая часть (под символами указаны шестнадцатеричные коды Unicode):
Для кодировки cp1251 существуют разновидности (казахская, чувашская и т.д.). В консоли русифицированных систем семейства Windows NT используется кодировка cp866. Первая часть таблицы кодировки (латиница) полностью соответствует кодировке ASCII. Вторая часть (под символами указаны шестнадцатеричные коды Unicode):
Для кодировки cp866 существуют разновидности (чувашская, ГОСТ 19768-87 и т.д.). Стандартом для русской кириллицы в юникс-подобных операционных системах является кодировка КОИ-8 (код обмена информацией, 8 битов), или KOI8. Существует несколько вариантов кодировки КОИ-8 для различных кириллических алфавитов. Русский алфавит описывается в кодировке KOI8-R, украинский — в KOI8-U, существуют также кодировки KOI8-RU (русско-белорусско-украинская), KOI8-T (таджикская) и т.д. Разработчики КОИ-8 разместили символы русского алфавита таким образом, что если в тексте, написанном в КОИ-8, убирать восьмой бит каждого символа, то получается "читабельный" текст, хотя он и написан латинскими символами. Вторая часть кодировки KOI8-R (русская), под символами указаны шестнадцатеричные коды Unicode:
Юникод, или Уникод (Unicode) - это стандарт кодирования символов, позволяющий представить знаки практически всех письменных языков. Чаще всего для обозначения символов Unicode используется запись вида "U+xxxx" (для кодов 0...FFFF), где xxx - шестнадцатеричные цифры. Первая версия Юникода представляла собой кодировку с фиксированным размером символа в 16 бит, то есть общее число кодов было 216 (65536). Отсюда и происходит практика обозначения символов четырьмя шестнадцатеричными цифрами (например, U+0410). Коды в стандарте Unicode разделены на несколько областей, например:
В дальнейшем было принято решение расширить кодовую область, и коды символов стали рассматриваться не как 16-битные значения, а как абстрактные числа, которые в компьютеремогут представляться множеством разных способов. Однако, поскольку в ряде компьютерных систем (например, Windows NT) до изобретения Юникода уже были реализованы 16-битные символы, было решено всё наиболее важное кодировать только в пределах первых 65536 позиций (так наз. Basic Multilingual Plane, BMP). Остальное пространство используется для "дополнительных символов" (Supplementary Characters): систем письма вымерших языков или очень редко используемых китайских иероглифов, математических и музыкальных символов. Стандарт Юникода содержит семейство кодировок (форм представления или UTF, Unicode Transformation Format): UTF-8, UTF-16, UTF-32 и некоторые другие, которые отличаются между собой способом хранения данных (количество байт на символ, фиксированное или нефиксированное количество байт на символ). Была разработана также форма представления UTF-7 для передачи по семибитным каналам, но из-за несовместимости с ASCII она не получила распространения и не включена в стандарт. UTF-8 - это представление Юникода, обеспечивающее наилучшую совместимость со старыми системами, использовавшими 8-битные символы. Текст, состоящий только из символов с номером меньше 128, при записи в UTF-8 превращается в обычный текст ASCII. И наоборот, в тексте UTF-8 любой байт со значением меньше 128 изображает символ ASCII с тем же кодом. Для совместимости со старыми 16-битными системами была изобретена система UTF-16, где первые 65536 позиций отображаются непосредственно как 16-битные числа, а остальные представляются в виде "суррогатных пар". В Microsoft Windows NT/2000/XP в основном используется форма UTF-16. В UNIX-подобных операционных системах GNU/Linux, BSD и Mac OS X принята форма UTF-8 для файлов и UTF-32 или UTF-8 для обработки символов в оперативной памяти. В Юникоде нет русских букв с ударением, но по стандарту их можно делать составными, добавляя символ U+0301 ("combining acute accent") после ударной гласной. Вообще, в Юникоде символы, имеющие дополнительные над- или подстрочные элементы, могут быть представлены в виде построенной по определённым правилам последовательности кодов (составной вариант, composite character) или в виде единого символа (монолитный вариант, precomposed character). Cимволы в Юникоде подразделяются на протяжённые и непротяжённые (бесширинные). Непротяжённые символы при отображении не занимают места в строке. К ним относятся, в частности, знаки ударения и прочие диакритические знаки. Как протяжённые, так и непротяжённые символы имеют собственные коды. Протяжённые символы иначе называются базовыми (base characters), а непротяжённые — модифицирующими (combining characters); причём последние не могут встречаться самостоятельно. Например, символ "a" с ударением может быть представлен как последовательность базового символа "a" (U+0061) и модифицирующего символа U+0301, или как монолитный символ "a" с ударением (U+00C1). Примечание: множество символов из языков с алфавитами на основе кириллицы не имеют монолитных форм. В Windows служебная программа "Таблица символов" (для вызова наберите "charmap" в командной строке) позволяет вывести на экран таблицу всех символов от U+0000 до U+FFFF, поддерживаемых конкретным шрифтом. Также эта программа позволяет выделять отдельные символы и копировать их в буфер обмена. В некоторых приложениях, например WordPad и MS Word, работает способ ввода символов по шестнадцатеричному коду: нужно набрать этот код, и нажать Alt+X. Код будет заменён на соответствующий символ. Работает и обратное преобразование: если выделить символ и нажать Alt+X, то этот символ будет заменён на его шестнадцатеричный код. Кроме того, во многих Windows-приложениях будет работать следующее: если нажать клавишу Alt, и не отпуская её, ввести код на блоке дополнительной цифровой клавиатуры, будет введён соответствующий символ. Таким способом могут вводиться символы различных кодировок по достаточно сложным правилам, которые могут срабатывать по-разному в разных программах, и описаны, например, в статье "Вводим отсутствующие на клавиатуре символы" журнала "Компьютерра" (эту статью можно найти в Интернете). В HTML все символы могут быть закодированы в числовом обозначении с использованием десятичного (&#DD;) или шестнадцатеричного (&#xHHHH;) кода Unicode. Hапример, буква "Ё":Ё или Ё. В HTML можно использовать также модифицирующие непротяжённые символы, например, для расстановки ударений. Код: <span style="font-family:Arial">Ма́ма мы́ла ра́му.</span>
Будет отображён так: Ма́ма мы́ла ра́му.
Разрешение проблемБлагодарность за предоставленные рецепты и пояснения - участнику сообщества под ником YMP.
Иногда значительные неудобства доставляют тексты, сохранённые в неправильной кодировке. Например, текст в кодировке КОИ-8, сохранённый в кодировке cp1251, выглядит примерно следующим образом: оНМЪРХЕ ЯЙПХОРХМЦЮ (МЮОХЯЮМХЪ ЯЙПХОРНБ) ПЮАНРЮЕР ДНБНКЭМН УНПНЬН,
ЕЯКХ ОНМХЛЮРЭ ЯЙПХОР ЙЮЙ РЕЮРПЮКЭМШИ ЯЖЕМЮПХИ.
уНРЪ ЯЖЕМЮПХИ ЪБКЪЕРЯЪ ХЯВЕПОШБЮЧЫХЛ,
ОПНПЮАНРЙЮ ДЕРЮКЕИ ХЯОНКМЕМХЪ НЯРЮБКЕМЮ ДЕИЯРБСЧЫХЛ ЮЙРЕПЮЛ Х ПЕФХЯЯЕПС.
й ЯНФЮКЕМХЧ, РЮЙХЛ НАПЮГНЛ МЕКЭГЪ ЯСГХРЭ НОПЕДЕКЕМХЕ ЯЙПХОРНБШУ ЪГШЙНБ:
ЛЮМХОСКХПСЪ ОПХКНФЕМХЪЛХ, КЧАНИ ЪГШЙ МХГЬЕЦН СПНБМЪ ЛНФМН ХЯОНКЭГНБЮРЭ ЙЮЙ ЯЙПХОРНБШИ ЪГШЙ!
Чтобы прочитать такой текст, можно проделать следующее:
В некоторых случаях происходят ошибки при копировании текста через буфер обмена из одной программы в другую - вставка может превращать текст в "кракозябры". Это может происходить из-за того, что приложение, из которого производится копирование, помещает текст в буфер обмена в 8-битной кодировке, а то, в которое происходит вставка, запрашивает его в Юникоде (так делает, например, Блокнот). Windows "идёт навстречу" и перекодирует текст. При копировании в буфер помещается также информация о языке. Это может делать само приложение, а если не делает, то Windows просто смотрит, на какой язык ввода было переключено приложение в момент копирования. Если на русский, то используется страница 1251 и при вставке всё нормально. Но если текст русский, а окно приложения было переключено в английский, кодирование пойдёт через 1252 страницу и вместо русских букв пойдут "кракозябры". В таких случаях может помочь предварительное переключение приложения, из которого производится копирование, на русский. Обратный случай: русский текст помещён в буфер в Юникоде, когда окно было на английском, а вставляется в 8-битной кодировке. Таблица перекодировки берётся опять не та - 1252. Юникодовских кодов для русских букв там просто нет. Не найдя их, Windows использует подстановочный знак для "неизвестного символа" - отсюда вместо русского текста сплошь вопросительные знаки. Например, при копировании текста через буфер обмена из некоторых PDF-документов можно получить текст "кракозябрами". При копировании из Adobe Reader текст в буфер помещается как в 8-битной кодировке, так и в Юникоде. Похоже, что Adobe Reader сам его перекодирует до того, как положить в буфер. Локаль буфера он не переключает, она соответствует языку окна. Если приложение, в которое осуществляется вставка, запрашивает текст в 8-битной кодировке, в нём отображается всё нормально, а если в Юникоде - в нём идут "кракозябры". Возможно, в самом PDF-документе содержится информация о том, какую страницу использовать при перекодировке, так как такое происходит, конечно, далеко не во всех PDF-документах. В такой ситуации могут выручить приложения, которые запрашивают текст в 8-битной кодировке, например свободный текстовый редактор AkelPad или PuntoSwitcher с его многокарманным буфером. Чтобы перенести подобный текст, можно проделать следующее:
Людоговский Александр | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
Всего комментариев: 0 | |