Виды кодировок текста: Виды кодировок символов [АйТи бубен]
Кодировка текста ASCII (Windows 1251, CP866, KOI8-R) и Юникод (UTF 8, 16, 32) — как исправить проблему с кракозябрами
Здравствуйте, уважаемые читатели блога KtoNaNovenkogo.ru. Сегодня мы поговорим с вами про то, откуда берутся кракозябры на сайте и в программах, какие кодировки текста существуют и какие из них следует использовать. Подробно рассмотрим историю их развития, начиная от базовой ASCII, а также ее расширенных версий CP866, KOI8-R, Windows 1251 и заканчивая современными кодировками консорциума Юникод UTF 16 и 8.
Кому-то эти сведения могут показаться излишними, но знали бы вы, сколько мне приходит вопросов именно касаемо вылезших кракозябров (не читаемого набора символов). Теперь у меня будет возможность отсылать всех к тексту этой статьи и самостоятельно отыскивать свои косяки. Ну что же, приготовьтесь впитывать информацию и постарайтесь следить за ходом повествования.
ASCII — базовая кодировка текста для латиницы
Развитие кодировок текстов происходило одновременно с формированием отрасли IT, и они за это время успели претерпеть достаточно много изменений. Исторически все начиналось с довольно-таки не благозвучной в русском произношении EBCDIC, которая позволяла кодировать буквы латинского алфавита, арабские цифры и знаки пунктуации с управляющими символами.
Но все же отправной точкой для развития современных кодировок текстов стоит считать знаменитую ASCII (American Standard Code for Information Interchange, которая по-русски обычно произносится как «аски»). Она описывает первые 128 символов из наиболее часто используемых англоязычными пользователями — латинские буквы, арабские цифры и знаки препинания.
Еще в эти 128 знаков, описанных в ASCII, попадали некоторые служебные символы навроде скобок, решеток, звездочек и т.п. Собственно, вы сами можете увидеть их:
Именно эти 128 символов из первоначального вариант ASCII стали стандартом, и в любой другой кодировке вы их обязательно встретите и стоять они будут именно в таком порядке.
Но дело в том, что с помощью одного байта информации можно закодировать не 128, а целых 256 различных значений (двойка в степени восемь равняется 256), поэтому вслед за базовой версией Аски появился целый ряд расширенных кодировок ASCII, в которых можно было кроме 128 основных знаков закодировать еще и символы национальной кодировки (например, русской).
Тут, наверное, стоит еще немного сказать про системы счисления, которые используются при описании. Во-первых, как вы все знаете, компьютер работает только с числами в двоичной системе, а именно с нулями и единицами («булева алгебра», если кто проходил в институте или в школе). Один байт состоит из восьми бит, каждый из которых представляет из себя двойку в степени, начиная с нулевой, и до двойки в седьмой:
Не трудно понять, что всех возможных комбинаций нулей и единиц в такой конструкции может быть только 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 в один байт. Поэтому таких вариантов существует целая куча. Только лишь для кодирования символов русского языка существует несколько разновидностей расширенной Аски.
Например, изначально появилась CP866, в которой была возможность использовать символы русского алфавита и она являлась расширенной версией ASCII.
Т.е. ее верхняя часть полностью совпадала с базовой версией Аски (128 символов латиницы, цифр и еще всякой лабуды), которая представлена на приведенном чуть выше скриншоте, а вот уже нижняя часть таблицы с кодировкой CP866 имела указанный на скриншоте чуть ниже вид и позволяла закодировать еще 128 знаков (русские буквы и всякая там псевдографика):
Видите, в правом столбце цифры начинаются с 8, т.к. числа с 0 до 7 относятся к базовой части ASCII (см. первый скриншот). Т.о. русская буква «М» в CP866 будет иметь код 9С (она находится на пересечении соответствующих строки с 9 и столбца с цифрой С в шестнадцатеричной системе счисления), который можно записать в одном байте информации, и при наличии подходящего шрифта с русскими символами эта буква без проблем отобразится в тексте.
Откуда взялось такое количество псевдографики в CP866? Тут все дело в том, что эта кодировка для русского текста разрабатывалась еще в те мохнатые года, когда не было такого распространения графических операционных систем как сейчас. А в Досе, и подобных ей текстовых операционках, псевдографика позволяла хоть как-то разнообразить оформление текстов и поэтому ею изобилует CP866 и все другие ее ровесницы из разряда расширенных версий Аски.
CP866 распространяла компания IBM, но кроме этого для символов русского языка были разработаны еще ряд кодировок, например, к этому же типу (расширенных ASCII) можно отнести KOI8-R:
Принцип ее работы остался тот же самый, что и у описанной чуть ранее CP866 — каждый символ текста кодируется одним единственным байтом. На скриншоте показана вторая половина таблицы KOI8-R, т.к. первая половина полностью соответствует базовой Аски, которая показана на первом скриншоте в этой статье.
Среди особенностей кодировки KOI8-R можно отметить то, что русские буквы в ее таблице идут не в алфавитном порядке, как это, например, сделали в CP866.
Если посмотрите на самый первый скриншот (базовой части, которая входит во все расширенные кодировки), то заметите, что в KOI8-R русские буквы расположены в тех же ячейках таблицы, что и созвучные им буквы латинского алфавита из первой части таблицы. Это было сделано для удобства перехода с русских символов на латинские путем отбрасывания всего одного бита (два в седьмой степени или 128).
Windows 1251 — современная версия ASCII и почему вылезают кракозябры
Дальнейшее развитие кодировок текста было связано с тем, что набирали популярность графические операционные системы и необходимость использования псевдографики в них со временем пропала. В результате возникла целая группа, которая по своей сути по-прежнему являлись расширенными версиями Аски (один символ текста кодируется всего одним байтом информации), но уже без использования символов псевдографики.
Они относились к так называемым ANSI кодировкам, которые были разработаны американским институтом стандартизации. В просторечии еще использовалось название кириллица для варианта с поддержкой русского языка. Примером такой может служить Windows 1251.
Она выгодно отличалась от используемых ранее CP866 и KOI8-R тем, что место символов псевдографики в ней заняли недостающие символы русской типографики (окромя знака ударения), а также символы, используемые в близких к русскому славянских языках (украинскому, белорусскому и т.д.):
Из-за такого обилия кодировок русского языка, у производителей шрифтов и производителей программного обеспечения постоянно возникала головная боль, а у нас с вам, уважаемые читатели, зачастую вылезали те самые пресловутые кракозябры, когда происходила путаница с используемой в тексте версией.
Очень часто они вылезали при отправке и получении сообщений по электронной почте, что повлекло за собой создание очень сложных перекодировочных таблиц, которые, собственно, решить эту проблему в корне не смогли, и зачастую пользователи для переписки использовали транслит латинских букв, чтобы избежать пресловутых кракозябров при использовании русских кодировок подобных CP866, KOI8-R или Windows 1251.
По сути, кракозябры, вылазящие вместо русского текста, были результатом некорректного использования кодировки данного языка, которая не соответствовала той, в которой было закодировано текстовое сообщение изначально.
Допустим, если символы, закодированные с помощью CP866, попробовать отобразить, используя кодовую таблицу Windows 1251, то эти самые кракозябры (бессмысленный набор знаков) и вылезут, полностью заменив собой текст сообщения.
Аналогичная ситуация очень часто возникает при создании сайтов на WordPress и Joomla, форумов или блогов, когда текст с русскими символами по ошибке сохраняется не в той кодировке, которая используется на сайте по умолчанию, или же не в том текстовом редакторе, который добавляет в код отсебятину не видимую невооруженным глазом.
В конце концов такая ситуация с множеством кодировок и постоянно вылезающими кракозябрами многим надоела, появились предпосылки к созданию новой универсальной вариации, которая бы заменила собой все существующие и решила бы, наконец, на корню проблему с появлением не читаемых текстов. Кроме этого существовала проблема языков подобных китайскому, где символов языка было гораздо больше, чем 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, состоящий из четырех шестнадцатеричных цифр:
Сколько символов можно закодировать в UTF-16 с помощью 16 бит? 65 536 (два в степени шестнадцать), и именно это число было принято за базовое пространство в Юникоде. Помимо этого существуют способы закодировать с помощью нее и около двух миллионов знаков, но ограничились расширенным пространством в миллион символов текста.
Но даже эта удачная версия кодировки Юникода не принесла особого удовлетворения тем, кто писал, допустим, программы только на английском языке, ибо у них, после перехода от расширенной версии ASCII к UTF-16, вес документов увеличивался в два раза (один байт на один символ в Аски и два байта на тот же самый символ в ЮТФ-16).
Вот именно для удовлетворения всех и вся в консорциуме Unicode было решено придумать кодировку переменной длины. Ее назвали UTF-8. Несмотря на восьмерку в названии, она действительно имеет переменную длину, т.е. каждый символ текста может быть закодирован в последовательность длиной от одного до шести байт.
На практике же в UTF-8 используется только диапазон от одного до четырех байт, потому что за четырьмя байтами кода ничего уже даже теоретически не возможно представить. Все латинские знаки в ней кодируются в один байт, так же как и в старой доброй ASCII.
Что примечательно, в случае кодирования только латиницы, даже те программы, которые не понимают Юникод, все равно прочитают то, что закодировано в ЮТФ-8. Т.е. базовая часть Аски просто перешла в это детище консорциума Unicode.
Кириллические же знаки в UTF-8 кодируются в два байта, а, например, грузинские — в три байта. Консорциум Юникод после создания UTF 16 и 8 решил основную проблему — теперь у нас в шрифтах существует единое кодовое пространство. И теперь их производителям остается только исходя из своих сил и возможностей заполнять его векторными формами символов текста. Сейчас в наборы даже эмодзи смайлики добавляют.
В приведенной чуть выше «Таблице символов» видно, что разные шрифты поддерживают разное количество знаков. Некоторые насыщенные символами Юникода шрифты могут весить очень прилично. Но зато теперь они отличаются не тем, что они созданы для разных кодировок, а тем, что производитель шрифта заполнил или не заполнил единое кодовое пространство теми или иными векторными формами до конца.
Кракозябры вместо русских букв — как исправить
Давайте теперь посмотрим, как появляются вместо текста кракозябры или, другими словами, как выбирается правильная кодировка для русского текста. Собственно, она задается в той программе, в которой вы создаете или редактируете этот самый текст, или же код с использованием текстовых фрагментов.
Для редактирования и создания текстовых файлов лично я использую очень хороший, на мой взгляд, Html и PHP редактор Notepad++. Впрочем, он может подсвечивать синтаксис еще доброй сотни языков программирования и разметки, а также имеет возможность расширения с помощью плагинов. Читайте подробный обзор этой замечательной программы по приведенной ссылке.
В верхнем меню Notepad++ есть пункт «Кодировки», где у вас будет возможность преобразовать уже имеющийся вариант в тот, который используется на вашем сайте по умолчанию:
В случае сайта на 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++ сохраните документ в нужной вам кодировке или же откроете документ с сайта для редактирования, то в правом нижнем углу редактора сможете увидеть ее название:
Чтобы избежать кракозябров, кроме описанных выше действий, будет полезным прописать в его шапке исходного кода всех страниц сайта информацию об этой самой кодировке, чтобы на сервере или локальном хосте не возникло путаницы.
Вообще, во всех языках гипертекстовой разметки кроме 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 (которые правильно прочитаются всегда и в любой вариации) браузер уже должен иметь информацию о том, как интерпретировать коды этих символов.
Удачи вам! До скорых встреч на страницах блога KtoNaNovenkogo.ru
Использую для заработка
Рубрика: Вебмастеру
О кодировках и кодовых страницах / Хабр
Вряд ли это сейчас сильно актуально, но может кому-то покажется интересным (или просто вспомнит былые годы).
Начну с небольшого экскурса в историю компьютера. Поскольку компьютер использовался для обработки информации, то он просто обязан представлять эту информацию в «человеческом» виде. Компьютер хранит информацию в виде чисел (байтов), а человек воспринимает символы (буквы, цифры, различные знаки). Значит, надо сделать сопоставление число <-> символ и задача будет решена. Сначала посчитаем, сколько символов нам надо (не забудем, что «мы» — американцы, использующие латинский алфавит). Нам надо 10 цифр + 26 заглавных букв английского алфавита + 26 строчных букв + математические знаки (хотя бы +-/*=><%) + знаки препинания (.,!?:;’” ) + различные скобки + служебные символы (_^%$@|) + 32 непечатных управляющих символов для работы с устройствами (в первую очередь, с телетайпом). В общем, 128 символов хватает «впритык» и этот стандартный набор символов «мы» назвали ASCII, т.е. «American Standard Code for Information Interchange»
Отлично, для 128 символов достаточно 7 бит. С другой стороны, в байте 8 бит и каналы связи 8-битные (забудем про «доисторические» времена, когда в байте и каналах бит было меньше). По 8-ми битному каналу будем передавать 7 бит кода символа и 1 бит контрольный (для повышения надежности и распознавания ошибок). И все было замечательно, пока компьютеры не стали использоваться в других странах (где латиница содержит больше 26 символов или вообще используется не латинский алфавит). Вместо того, чтобы всем поголовно освоить английский, жители СССР, Франции, Германии, Грузии и десятков других стран захотели, чтобы компьютер общался с ними на их родном языке. Пути были разные (в зависимости от остроты проблемы): одно дело, если к 26 символам латиницы надо добавить 2-3 национальных символа (можно пожертвовать какими-то специальными) и другое дело, когда надо «вклинить» кириллицу. Теперь «мы» — русские, стремящиеся «русифицировать» технику. Первыми были решения на основе замены строчных английских букв прописными русскими. Однако проблема в том, что русских букв (33) и они не влезают на 26 мест. Надо «уплотнить» и первой жертвой этого уплотнения пала буква Ё (еe просто повсеместно заменили на Е). Другой прием – вместо «русских» A,E,K,M,H,O,P,C,T стали использовать похожие английские (таких букв даже больше чем надо, но в некоторых парах прописные похожие, а строчные — не очень: Hh Tt Bb Kk Mm). Но все же «вклинили » и в результате весь вывод шел ПРОПИСНЫМИ БУКВАМИ, что неудобно и некрасиво, однако со временем привыкли. Второй прием – «переключение языка». Код русского символа совпадал с кодом английского символа, но устройство помнило, что сейчас оно в русском режиме и выводило символ кириллицы (а в английском режиме – латиницы). Режим переключался двумя служебными символами: Shift Out (SO, код 14) на русский и Shift IN (SI, код 15) на английский (интересно, что когда-то в печатных машинках использовалась двухцветная лента и SO приводил к физическому подъему ленты и в результате печать шла красным, а SI ставил ленту на место и печать снова шла черным). Текст с большими и маленькими буквами стал выглядеть вполне прилично. Все эти варианты более-менее работали на больших компьютерах, но после выпуска IBM PC началось массовое распространение персональных компьютеров по всему миру и надо было что-то решать централизовано.
Решением стала разработанная фирмой IBM технология кодовых страниц. К этому времени «контрольный символ» при передаче потерял свою актуальность и все 8-бит можно было использовать для кода символа. Вместо диапазона кодов 0-127 стал доступен диапазон 0-255. Кодовая страница (или кодировка)– это сопоставление кода из диапазона 0-255 некоему графическому образу (например, букве «Я» кириллицы или букве «омега» греческого). Нельзя сказать «символ с кодом 211 выглядит так», но можно сказать «символ с кодом 211 в кодовой странице CP1251 выглядит так: У, а в CP1253(греческая) выглядит так: Σ ». Во всех (или почти всех) кодовых таблица первые 128 кодов соответствуют таблице ASCII, только для первых 32 непечатных кодов IBM «назначила» свои картинки (которые показывается при выводе на экран монитора). В верхней части IBM разместила символы псевдографики (для рисования различных рамок), дополнительные символы латиницы, используемые в странах Западной Европы, некоторые математические символы и отдельные символы греческого алфавита. Эта кодовая страница получила название CP437 (IBM разработала и множество других кодовых страниц) и по умолчанию использовалась в видеоадаптерах. Кроме того, различные центры стандартизации (мировые и национальные) создали кодовые страницы для отображения национальных символов. Наши компьютерные «умы» предложили 2 варианта: основная кодировка ДОС и альтернативная кодировка ДОС. Основная предназначалась для работы везде, а альтернативная — в особых случаях, когда использование основной неудобно. Оказалось, что таких особых случаев большинство и основной (не по названию, а по использованию) стала именно «альтернативная» кодировка. Думаю, такой исход был ясен с самого начала для большинства специалистов (кроме «ученых мужей», оторванных от жизни). Дело в том, что в большинстве случаев использовались английские программы, которые «для красоты» активно использовали псевдографику для рисования различных рамок и тп. Типичные пример — суперпопулярный Нортон коммандер, стоящий тогда на большинстве компьютеров. Основная кодировка на местах псевдографики разместила русские символы и панели нортона выглядели просто ужасно (равно как и любой другой псевдографический вывод). А альтернативная кодировка бережно сохранила символы пседографики, использую для русских букв другие места. В результате и с Нортон коммандером и с другими программами вполне можно было работать. Андрей Чернов (широко известная личность в то время) разработал кодировку KOI8-R (КОИ8), пришедшую с «больших» компьютеров, где господствовал UNIX. Ее особенностью было то, что если у русского символа пропадал 8-й бит, то получившийся в результате «обрезания» английский символ будет созвучен исходному русскому. И вместо «Привет» получался «pRIVET», что не совсем то, но хотя бы читаемо. В результате в СССР на компьютерах использовали 3 различных кодовых страницы (основную, альтернативную и KOI8). И это не считая различных «вариаций», когда в альтернативной кодировке, скажем, отдельные символы (а то и строки) изменялись. От KOI8 тоже «отпочковывались» варианты — украинский, белорусский, таджикский, кавказский и др. Оборудование (принтеры, видеодаптеры) тоже надо было настраивать (или «прошивать») для работы со своими кодировками. Коммерсанты могли привезти дешевую партию принтеров (из эмиратов, например, по бартеру) а они не работали с русскими кодировками.
Тем не менее в целом кодовые страницы позволили решить проблему вывода национальных символов (устройство просто должно уметь работать с соответствующей кодовой страницей), но породили проблему множественности кодировок, когда почтовая программа отправляет данные в одной кодировке, а принимающая программа показывает их в другой. В результате пользователь видит так называемые «кракозябры» (вместо «привет» написано «ЏаЁўҐв» или «оПХБЕР»). Потребовались программы-перекодировщики, переводящие данные из одной кодировки в другую. Увы, порой письма при прохождении через почтовые серверы неоднократно автоматически перекодировались (или даже «обрезался» 8-й бит) и нужно было найти и выполнить всю цепочку обратных преобразований.
После массового перехода на Windows к трем кодовым страницам добавилась четвертая (Windows-1251 она же CP1251 она же ANSI ) и пятая (CP866 она же OEM или DOS). Не удивляйтесь — Windows для работы с кириллицей в консоли по-умолчанию использует кодировку CP866 (русские символы такие же как в «альтернативной кодировке», только некоторые спецсимволы отличаются), для других целей — кодировку CP1251. Почему Windows понадобилось две кодировки, неужели нельзя было обойтись одной? Увы, не получается: DOS-кодировка используется в именах файлов (тяжелое наследие DOS) и консольные команды типа dir, copy должны правильно показывать и правильно обрабатывать досовские имена файлов. С другой стороны, в этой кодировке много кодов отведено символам псевдографики (различным рамкам и т.п.), а Windows работает в графическом режиме и ей (а точнее, windows-приложениям) не нужны символы псевдографики (но нужны занятые ими коды, которые в CP1251 использованы для других полезных символов). Пять кириллических кодировок поначалу еще больше усугубили ситуацию, но со временем наиболее популярными стали Windows-1251 и KOI8, а досовскими просто стали меньше пользоваться. Еще при использовании Windows стало неважно, какая кодировка в видеоадаптере (только изредка, до загрузки Windows в диагностических сообщениях можно видеть «кракозябры»).
Решение проблемы кодировок пришло, когда повсеместно стала внедряться система Unicode (и для персональных ОС и для серверов). Unicode каждому национальному символу ставит в соответствие раз и навсегда закрепленное за ним 20-ти битовое число («точку» в кодовом пространстве Unicode, причем чаще всего хватает 16 бит, поскольку 20-битные коды используются для редких символов и иероглифов), поэтому нет необходимости перекодировать (подробнее об Unicode см следующую запись в журнале). Теперь для любой пары <код байта>+<кодовая страница> можно определить соответствующий ей код в Unicode (сейчас в кодовых страницах для каждого 8-битного кода показывается 16-битный код Unicode) и потом при необходимости вывести этот символ для любой кодовой страницы, где он присутствует. В настоящее время проблема кодировок и перекодировок для пользователей практически исчезла, но все же изредка приходят письма, где либо тема письма либо содержание «не в той» кодировке.
Интересно, что примерно год назад проблема кодировок ненадолго всплыла при «наезде» ФАС на сотовых операторов, мол те дискриминируют русскоязычных пользователей, поскольку за передачу кириллицы берут больше. Это объясняется техническим решением, выбранным разработчиком протокола SMS связи. Если бы его россияне разработали, они бы, возможно, отдали приоритет кириллице. В указанной статье «начальник управления контроля транспорта и связи Дмитрий Рутенберг отметил, что существуют и восьмибитные кодировки для кириллицы, которые могли бы использовать операторы.» Во как — на улице 21-й век, Unicode шагает по миру, а господин Рутенберг тянет нас в начало 90-х, когда шла «война кодировок» и проблема перекодировок стояла во весь рост. Интересно, в какой кодировке должен получить СМС Вася Пупкин, пользующийся финским телефоном, находящийся в Турции на отдыхе, от жены с корейским телефоном, отправляющей СМС из Казахстана? А от своего французского компаньона (с японским телефоном), находящегося в Испании? Думаю, никакой начальник ответа на этот вопрос дать не сможет. К счастью, это «экономное» предложение не воплотилось в жизнь.
Юный читатель может спросить — а что помешало сразу использовать Unicode, зачем были придуманы эти заморочки с кодовыми страницами? Думаю, дело в финансовой стороне проблемы. Unicode требует в 2 раза больше памяти, а память стоит денег (и дисковая и ОЗУ). Стал бы американец покупать компьютер на 1-2 тыс дороже из-за того, что «теперь новая ОС требует больше памяти, но позволяет без проблем работать с русским, европейскими, арабскими языками»? Боюсь, простой англоязычный покупатель воспринял бы такой аргумент «неадекватно» (и обратился бы к другим производителям).
Про кодировки и Юникод / Хабр
Вначале стоит разъяснить пару терминов. Кодовая страница — таблица заранее известного размера, каждой позиции (или коду) которой сопоставлен единственный символ или его отсутствие. Например, кодовая страница размерностью 256, где 71-й позиции соответствует буква «G». Кодировка — правило кодирования символа в числовое представление. Любая кодировка создается для определенной кодовой страницы. Для примера, символ «G» в кодировке Абрвал примет значение 71. Кстати, простейшие кодировки так и поступают — представляют символы их значениями в кодовых таблицах, ASCII тоже к таким относится.
Раньше для кодирования хватало всего 7 бит на символ. А что? достаточно для 128 различных знаков, вмещалось все необходимое тогдашним пользователям: английский алфавит, знаки препинания, цифры и некоторых спецсимволы. Основная англоязычная 7-битная кодировка с соответствующей ей кодовой страницей получили название ASCII (American Standard Code for Information Interchange), они же заложили основы на будущее. Позже, когда компьютеры распространились в неанглоговорящие страны, появилась нужда в национальных языках, здесь-то фундамент ASCII и пригодился. Компьютеры обрабатывают информацию на уровне байтов, а код ASCII занимает только 7 первых бит. Использование 8-го расширяло пространство до 256 мест без потери совместимости, а вместе с ней и поддержки английского языка, это было важно. На этом факте выстроено большинство неанглоязычных кодовых страниц и кодировок: нижние 128 позиций как у ASCII, а верхние 128 отведены для национальных нужд и кодировались со старшим битом. Однако, создание для каждого языка (иногда группы схожих языков) собственной страницы и кодировки привело к возникновению проблем с поддержкой такого хозяйства разработчиками операционных систем и программного обеспечения в целом.
Для выхода из ситуации организовали консорциум, разработавший и предложивший стандарт Юникода. В нем предполагалось объединить знаки всех языков мира в одной большой таблице. Кроме того, определялись кодировки. Сначала ребята посчитали, что 65 535 посадочных мест должно хватить всем, ввели UCS-2 — кодировку с фиксированной 16-битной длиной кодов. Но пришли азиаты с многотомными азбуками, и расчеты рухнули. Кодовую область увеличили вдвое, UCS-2 уже не смогла бы справиться, появилась 32-битная UCS-4. Ощутимыми преимуществами кодировок UCS являлись постоянная кратная двум длина кодов и простейший алгоритм кодирования, и то, и другое способствовало скорости обработки текса компьютером. Но при этом была и неоправданная, чересчур расточительная трата места: представьте, что в ASCII 00010101, то в UCS-2 00000000 00010101, а UCS-4 уже 00000000 00000000 00000000 00010101. С этим нужно было что-то делать.
Развитие Юникода повернуло в сторону кодировок с переменной длиной получаемых кодов. Представителями стали UTF-8, UTF-16 и UTF-32, последняя условно-досрочно, так как на данный момент она идентична UCS-4. Каждый символ в UTF-8 занимает от 8 до 32 бит, причем есть совместимость с ASCII. В UTF-16 16 или 32 бита, UTF-32 — 32 бита (если бы пространство Юникода расширили еще вдвое, то уже 32 или 64 бита), с ASCII эти две не дружат. Количество занимаемых байтов, зависит от позиции символа в таблице Юникода. Очевидно, наиболее практичная кодировка — UTF-8. Именно благодаря своей совместимости с ASCII, небольшой прожорливости до памяти и достаточно простым правилам кодирования, она является наиболее распространенной и перспективной кодировкой Юникода. Ну, а в завершение красивая схема преобразования кода символа в UTF-8:
Автоопределение кодировки текста / Хабр
Введение
Я очень люблю программировать, я любитель и первый и последний раз заработал на программировании в далёком 1996 году. Но для автоматизации повседневных задач иногда что-то пишу. Примерно год назад открыл для себя golang. В качестве инструмента создания утилит golang оказался очень удобным. Итак.
Возникла потребность обработать большое количество (больше тысячи, так и вижу улыбки профи) архивных файлов со специальной геофизической информацией. Формат файлов текстовый, простой. Если вдруг интересно то это LAS формат.
LAS файл содержит заголовок и данные.
Данные практически CSV, только разделитель табуляция или пробелы.
А заголовок содержит описание данных и вот в нём обычно содержится русский текст. Это может быть название месторождения, название исследований, записанных в файл и пр.
Файлы эти созданы в разное время и в разных программах, доходит до того, что в одном файле часть в кодировке CP1251, а часть в CP866. Файлы эти мне нужно обработать, а значит понять. Вот и потребовалось определять автоматически кодировку файла.
В итоге изобрёл велосипед на golang и соответственно родилась маленькая библиотечка с возможностью детектировать кодовую страницу.
Про кодировки. Не так давно на хабре была хорошая статья про кодировки Как работают кодировки текста. Откуда появляются «кракозябры». Принципы кодирования. Обобщение и детальный разбор Если хочется понять, что такое “кракозябры” или “кости”, то стоит прочитать.
В начале я накидал своё решение. Потом пытался найти готовое работающее решение на golang, но не вышло. Нашлось два решения, но оба не работают.
- Первое “из коробки”— golang.org/x/net/html/charset функция DetermineEncoding()
- Второе библиотека — saintfish/chardet на github
Обе уверенно ошибаются на некоторых кодировках. Стандартная та вообще почти ничего определить не может по текстовым файлам, оно и понятно, её для html страниц делали.
При поиске часто натыкался на готовые утилиты из мира linux — enca. Нашёл её версию скомпилированную для WIN32, версия 1.12. Её я тоже рассмотрю, там есть забавности. Я прошу сразу прощения за своё полное незнание linux, а значит возможно есть ещё решения которые тоже можно попытаться прикрутить к golang коду, я больше искать не стал.
Сравнение найденных решений на автоопределение кодировки
Подготовил каталог softlandia\cpd тестовые данные с файлами в разных кодировках. Содержимое файлов очень короткое и одинаковое. Одна строка “Русский в кодировке CodePageName”. Дополнил файлами со смешением кодировок и некоторыми сложными случаями и попробовал определить.
Мне кажется, получилось забавно.
Наблюдение 1
enca не определила кодировку у файла UTF-16LE без BOM — это странно, ну ладно. Я попробовал добавить больше текста, но результата не получил.
Наблюдение 2. Проблемы с кодировками CP1251 и KOI8-R
Строка 15 и 16. У команды enca есть проблемы.
Здесь сделаю объяснение, дело в том, что кодировки CP1251 (она же Windows 1251) и KOI8-R очень близки если рассматривать только алфавитные символы.
Таблица CP 1251
Таблица KOI8-r
В обеих кодировках алфавит расположен от 0xC0 до 0xFF, но там, где у одной кодировки заглавные буквы, у другой строчные. Судя по всему enca, работает по строчным буквам. Вот и получается, если подать на вход программе enca строку “СТП” в кодировке CP1251, то она решит, что это строка “яро” в кодировке KOI8-r, о чём и сообщит. В обратную сторону также работает.
Наблюдение 3
Стандартной библиотеке html/charset можно доверить только определение UTF-8, но осторожно! Пользоваться следует именно charset.DetermineEncoding(), поскольку метод utf8.Valid(b []byte) на файлах в кодировке utf-16be возвращает true.
Собственный велосипед
Автоопределение кодировки возможно только эвристическими методами, неточно. Если мы не знаем, на каком языке и в какой кодировке записан текстовый файл, то определить кодировку с высокой точночностью наверняка можно, но будет сложновато… и нужно будет достаточно много текста.
Для меня такая цель не стояла. Мне достаточно определять кодировки в предположении, что там есть русский язык. И второе, определять нужно по небольшому количеству символов – на 10 символах должно быть достаточно уверенное определение, а желательно вообще на 5–6 символах.
Алгоритм
Когда я обнаружил совпадение кодировок KOI8-r и CP1251 по местоположению алфавита, то на пару дней загрустил… стало понятно, что чуть-чуть придётся подумать. Получилось так.
Основные решения:
- Работу будем вести со слайсом байтов, для совместимости с charset.DetermineEncoding()
- Кодировку UTF-8 и случаи с BOM проверяем отдельно
- Входные данные передаём по очереди каждой кодировке. Каждая сама вычисляет два целочисленных критерия. У кого сумма двух критериев больше, тот и выиграл.
Критерии соответствия
Первый критерий
Первым критерием является количество самых популярных букв русского алфавита.
Наиболее часто встречаются буквы: о, е, а, и, н, т, с, р, в, л, к, м, д, п, у. Данные буквы дают 82% покрытия. Для всех кодировок кроме KOI8-r и CP1251 я использовал только первые 9 букв: о, е, а, и, н, т, с, р, в. Этого вполне хватает для уверенного определения.
А вот для KOI8-r и CP1251 пришлось доработать напильником. Коды некоторых из этих букв совпадают, например буква о имеет в CP1251 код 0xEE при этом в KOI8-r этот код у буквы н. Для этих кодировок были взяты следующие популярные буквы. Для CP1251 использовал а, и, н, с, р, в, л, к, я. Для KOI8-r — о, а, и, т, с, в, л, к, м.
Второй критерий
К сожалению, для очень коротких случаев (общая длина русского текста 5-6 символов) встречаемость популярных букв на уровне 1-3 шт и происходит нахлёст кодировок KOI8-r и CP1251. Пришлось вводить второй критерий. Подсчёт количества пар согласная+гласная.
Такие комбинации ожидаемо наиболее часто встречаются в русском языке и соответственно в той кодировке в которой число таких пар больше, та кодировка имеет больший критерий.
Вычисляются оба критерия, складываются и полученная сумма является итоговым критерием.
Результат отражен в таблице выше.
Особенности, с которыми я столкнулся
Чуть коснусь прелестей и проблем, связанных с golang. Раздел может быть интересен только начинающим писать на golang.
Проблемы
Лично походил по некоторым подводным камушкам из 50 оттенков Go: ловушки, подводные камни и распространённые ошибки новичков.
Излишне переживая и пытаясь дуть на воду, прослышав от других о страшных ожогах от молока, переборщил с проверкой входного параметра типа io.Reader. Я проверял переменную типа io.Reader с помощью рефлексии.
//CodePageDetect - detect code page of ascii data from reader 'r'
func CodePageDetect(r io.Reader, stopStr ...string) (IDCodePage, error) {
if !reflect.ValueOf(r).IsValid() {
return ASCII, fmt.Errorf("input reader is nil")
}
...
Но как оказалось в моём случае достаточно проверить на nil. Теперь всё стало проще
func CodePageDetect(r io.Reader, stopStr ...string) (IDCodePage, error) {
//test input interfase
if r == nil {
return ASCII, nil
}
//make slice of byte from input reader
buf, err := bufio.NewReader(r).Peek(ReadBufSize)
if (err != nil) && (err != io.EOF) {
return ASCII, err
}
...
вызов bufio.NewReader( r ).Peek(ReadBufSize) спокойно проходит следующий тест:
var data *os.File
res, err := CodePageDetect(data)
В этом случае Peek() возвращает ошибку.
Разок наступил на грабли с передачей массивов по значению. Немного тупанул на попытке изменять элементы, хранящиеся в map, пробегая по ним в range…
Прелести
Сложно сказать что конкретно, постоянное ли битьё по рукам от линтера и компилятора или активное использование range, или всё вместе, но практически отсутствуют залёты по выходу индекса за пределы.
Конечно, очень приятно жить со сборщиком мусора. Полагаю мне ещё предстоит освоить грабли автоматизации выделения/освобождения памяти, но пока дебильная улыбка не покидает лица.
Строгая типизация — тоже кусочек счастья.
Переменные, имеющие тип функции — соответственно лёгкая реализация различного поведения у однотипных объектов.
Странно мало пришлось сидеть в отладчике, перечитывание кода обычно даёт результат.
Щенячий восторг от наличия массы инструментов из коробки, это чудное ощущение, когда компилятор, язык, библиотека и IDE Visual Studio Code работают на тебя вместе, слаженно.
Спасибо falconandy за конструктивные и полезные советы
Благодаря ему
- перевёл тесты на testify и они действительно стали более читабельны
- исправил в тестах пути к файлам данных для совместимости с Linux
- прошёлся линтером — таки он нашёл одну реальную ошибку (проклятущий copy/past)
Продолжаю добавлять тесты, выявился случай не определения UTF16. Обновил. Теперь UTF16 и LE и BE определяются даже в случае отсутствия русских букв
Кодировка html сделает ваш у интернет страничку читаемой
Приветствую, читатели и подписчики моего блога. В сегодняшней публикации я решил затронуть очень важную и объемную тему, которую необходимо знать каждому разработчику и верстальщику. Прочитав весь материал, вы узнаете какой бывает кодировка html-документов, для чего она необходима и что меняется при установке того или иного типа кодировки.
С какими проблемами можно столкнуться при неверном выборе, в каких программных продуктах можно изменять этот параметр, а также как ее можно задать в коде. Думаю, настало время приступить к делу!
Почему кодировка так важна и какие существуют типы?
Как только сфера IT начала развиваться, вместе с ней развивались и совершенствовались кодировки. Почему же они так важны для веб-разработки и сайтостроения?
На самом деле корректное отображение символов на дисплее девайсов – это достаточно сложная штука, ведь это не прямой процесс. Любой символ относящийся к кириллице, латинице, цифрам и другим алфавитам формируется благодаря двум параметрам:
- Векторное представление (формы) всевозможных единиц разных алфавитов, которые хранятся в документах со шрифтами на каждом персональном компьютере;
- Номер или код, по которому можно найти указанный символ в этих документах.
Так как за кодирование знаков отвечает не что иное, как операционная система, а после и программы, в которых вы работаете, любой текстовый контент для них выглядит как набор байтов. При этом каждый байт отвечает за конкретный символ. Из этого вы и получаете определенные размеры файлов.
Как же ОС подставляет нужные буквы и знаки? Для нее все очень просто. Осуществляется поиск символа по считанному коду в документе шрифтов и после подставляется.
На сегодняшний день существует несколько основных стандартов кодировок и их подтипов. К ним относятся ASCII и ее дочерние типы CP866, KOI8-R и Windows 1251, Unicode с кодировками UTF. Однако на сегодняшний день все лавры почета достались UTF-8. И это оправдано. Чтобы вы четко понимали сложившуюся ситуацию, переходим к следующей главе.
Досье на Аски
Начну свой рассказ с прародителя описываемого семейства, стоящего во главе символьного отображения.
ASCII (Аски) и первые наследники
В первых версиях Аски было доступно только 128 знаков, среди которых уместились латинские буквы, арабские цифры и дополнительные символы. Однако из-за недостатка значений, кодировка была расширена в 2 раза (т.е. до 256). Вследствие этого появилась возможность добавлять к существующим значениям свои. Наверное поэтому и существует несколько видов таблиц с русскими символами.
Первой в себя включила алфавит русского языка CP866. Помимо этого, в расширенную версию входила и псевдографика.
Вслед за ней свет увидел аналог – KOI8-R. Особенностью KOI8-R является расположение русских букв не по алфавиту, а в примерно тех же столбцах, что и созвучные латинские буквы.
В тот «железный век» IT-технологий не было такого изобилия графических ОС, поэтому псевдографика спасала разработчиков, помогая им создавать более-менее разнообразные веб-страницы.
Переход в современность – Windows 1251
Это еще один расширенный тип стандарта ASCII, однако он связан уже с современными графическими ОС. Что же это означает? А то, что псевдографика больше никому не была нужна.
Windows 1251 еще называют «в народе» кириллицей. Все потому что в данной таблице место ненужных знаков заняли недостающие символы русского и других славянских языков, а также аналогичная типографика.
Я перечислил наиболее популярные типы расширений Аски, однако их существовало намного больше. Вследствие этого началось деление власти и путаница среди используемых кодировок. Это привело к тому, что иногда на экране можно наблюдать появление непонятных значков, которые позже в широких кругах прозвали кракозябрами.
Эти чудовища появляются только тогда, когда неверно установлен тип кодировки. Долгое время эту проблему пытались решить разными способами. Но вслед за одной дилеммой появилась и другая – нехватка 256 байтов для хранения всех существующих символов (например, японского языка).
Приход новой власти
Спасательным кругом оказался новый стандарт кодирования алфавитов – Unicode. Все его кодировки имеют в названии UTF, а после через дефис количество битов для 1-го символа.
Так вот, продвинутые умы того времени скооперировались и создали UTF-32. Конечно это решило проблему нехватки места для тех же объемных иероглифов, однако вызвало другую – размер файлов увеличивался в 4 раза.
После выделяемая память уменьшилась до 16 бит. И наконец дошла до 8.
UTF-8 является стандартом, который не использует фиксированный размер битов для одного символа и в этом ее огромное преимущество: использование переменной длины.
Благодаря этому латиница и другие простые символы кодируются 1-м байтом, как и в ASCII. А вот «тяжелые» знаки могут быть представлены от одного и до шести байт последовательно. Стоит отметить, что помимо алфавитов, в таблицах Юникода можно найти всевозможные закорючки, смайлы, греческие буквы, цветы и другие нестандартные элементы.
Вот мы и разобрали, почему UTF-8 стала лидером.
Программы для перевода текста из одной кодировки в другую
На самом деле изменить формат кодирования файлов очень просто и доступно в большинстве программ: «Блокнот», «Notepad++», «PSPad» и другие аналоги предоставляют такую возможность, а также профессиональные продукты наподобие Visual Studio, IntelliJ IDEA и т.д.
Для новичков подойдет и работа в «Блокноте». Просто откройте нужный файл, выберете «Сохранить как…» и снизу диалогового окна измените вид кодировки.
Для более продвинутых отличным инструментом станет Notepad++. Он предлагает широкий выбор различных кодировок, в том числе UTF-8 с BOM и без него. Хотя предпочтительнее выбирать второй вариант.
Хочу сказать несколько слов о BOM. Полное название Byte Order Mark, что в русскоязычных кругах более известно, как «маркер последовательности (порядка) байтов». Такая метка устанавливается в самом начале документа с текстом и обычно используется для обмена файлами. Она занимает 3 байта, которые выглядят следующим образом: ef bb bf.
Однако, чтобы не было проблем с распознаванием кодировки файлов, стоит использовать UTF-8 без метки.
Набор инструментов для девелоперов
Для того, чтобы в коде задать определенный тип кодирования текстового контента, можно воспользоваться несколькими способами.
Первый вариант – это указать в документе .htaccess «AddDefaultCharset UTF-8».
Второй – в теге meta объявить значение для charset. Данный атрибут появился с выходом в свет html5. В качестве примера я прикрепил программную реализацию.
1 2 3 4 5 6 7 8 9 10 | <!DOCTYPE html> <html> <head> <meta charset="utf-8"> <title>Пример с charset</title> </head> <body> <h3>Привычный вид text-а! Все 4 слова и 2 числа отобразились корректно.<h3> </body> </html> |
<!DOCTYPE html> <html> <head> <meta charset=»utf-8″> <title>Пример с charset</title> </head> <body> <h3>Привычный вид text-а! Все 4 слова и 2 числа отобразились корректно.<h3> </body> </html>
Поэкспериментируйте и подставьте другие названия кодировок.
Если материал статьи был вам полезен и понравился, то подписывайтесь на обновления блога и делитесь ссылкой на статьи с друзьями. Желаю удачи. Пока-пока!
С уважением, Роман Чуешов
Загрузка…
Прочитано: 177 раз
Кодирование и декодирование / Хабр
Причиной разобраться в том, как же работает UTF-8 и что такое Юникод заставил тот факт, что VBScript не имеет встроенных функций работы с UTF-8. А так как ничего рабочего не нашел, то пришлось писть/дописывать самому. Опыт на мой взгляд полезный в любом случае. Для лучшего понимания начну с теории.
О Юникоде
До появления Юникода широко использовались 8-битные кодировки, главные минусы которых очевидны:
- Всего 255 символов, да и то часть из них не графические;
- Возможность открыть документ не с той кодировкой, в которой он был создан;
- Шрифты необходимо создавать для каждой кодировки.
Так и было решено создать единый стандарт «широкой» кодировки, которая включала бы все символы (при чем сначала хотели в нее включить только обычные символы, но потом передумали и начали добавлять и экзотические). Юникод использует 1 112 064 кодовых позиций (больше чем 16 бит). Начало дублирует ASCII, а дальше остаток латиницы, кирилица, другие европейские и азиатские символы. Для обозначений символов используют шестнадцатеричную запись вида «U+xxxx» для первых 65k и с большим количеством цифр для остальных.
О UTF-8
Когда-то я думал что есть Юникод, а есть UTF-8. Позже я узнал, что ошибался.
UTF-8 является лишь представлением Юникода в 8-битном виде. Символы с кодами меньше 128 представляются одним байтом, а так как в Юникоде они повторяют ASCII, то текст написанный только этими символами будет являться текстом в ASCII. Символы же с кодами от 128 кодируются 2-мя байтами, с кодами от 2048 — 3-мя, от 65536 — 4-мя. Так можно было бы и до 6-ти байт дойти, но кодировать ими уже ничего.
0x00000000 — 0x0000007F: 0xxxxxxx 0x00000080 — 0x000007FF: 110xxxxx 10xxxxxx 0x00000800 — 0x0000FFFF: 1110xxxx 10xxxxxx 10xxxxxx 0x00010000 — 0x001FFFFF: 11110xxx 10xxxxxx 10xxxxxx 10xxxxxx
Кодируем в UTF-8
Порядок действий примерно такой:
- Каждый символ превращаем в Юникод.
- Проверяем из какого символ диапазона.
- Если код символа меньше 128, то к результату добавляем его в неизменном виде.
- Если код символа меньше 2048, то берем последние 6 бит и первые 5 бит кода символа. К первым 5 битам добавляем 0xC0 и получаем первый байт последовательности, а к последним 6 битам добавляем 0x80 и получаем второй байт. Конкатенируем и добавляем к результату.
- Похожим образом можем продолжить и для больших кодов, но если символ за пределами U+FFFF придется иметь дело с UTF-16 суррогатами.
Function EncodeUTF8(s)
Dim i, c, utfc, b1, b2, b3
For i=1 to Len(s)
c = ToLong(AscW(Mid(s,i,1)))
If c < 128 Then
utfc = chr( c)
ElseIf c < 2048 Then
b1 = c Mod &h50
b2 = (c - b1) / &h50
utfc = chr(&hC0 + b2) & chr(&h80 + b1)
ElseIf c < 65536 And (c < 55296 Or c > 57343) Then
b1 = c Mod &h50
b2 = ((c - b1) / &h50) Mod &h50
b3 = (c - b1 - (&h50 * b2)) / &h2000
utfc = chr(&hE0 + b3) & chr(&h80 + b2) & chr(&h80 + b1)
Else
' Младший или старший суррогат UTF-16
utfc = Chr(&hEF) & Chr(&hBF) & Chr(&hBD)
End If
EncodeUTF8 = EncodeUTF8 + utfc
Next
End Function
Function ToLong(intVal)
If intVal < 0 Then
ToLong = CLng(intVal) + &h20000
Else
ToLong = CLng(intVal)
End If
End Function
Декодируем UTF-8
- Ищем первый символ вида 11xxxxxx
- Считаем все последующие байты вида 10xxxxxx
- Если последовательность из двух байт и первый байт вида 110xxxxx, то отсекаем приставки и складываем, умножив первый байт на 0x40.
- Аналогично для более длинных последовательностей.
- Заменяем всю последовательность на нужный символ Юникода.
Function DecodeUTF8(s)
Dim i, c, n, b1, b2, b3
i = 1
Do While i <= len(s)
c = asc(mid(s,i,1))
If (c and &hC0) = &hC0 Then
n = 1
Do While i + n <= len(s)
If (asc(mid(s,i+n,1)) and &hC0) <> &h80 Then
Exit Do
End If
n = n + 1
Loop
If n = 2 and ((c and &hE0) = &hC0) Then
b1 = asc(mid(s,i+1,1)) and &h4F
b2 = c and &h2F
c = b1 + b2 * &h50
Elseif n = 3 and ((c and &hF0) = &hE0) Then
b1 = asc(mid(s,i+2,1)) and &h4F
b2 = asc(mid(s,i+1,1)) and &h4F
b3 = c and &h0F
c = b3 * &h2000 + b2 * &h50 + b1
Else
' Символ больше U+FFFF или неправильная последовательность
c = &hFFFD
End if
s = left(s,i-1) + chrw( c) + mid(s,i+n)
Elseif (c and &hC0) = &h80 then
' Неожидаемый продолжающий байт
s = left(s,i-1) + chrw(&hFFFD) + mid(s,i+1)
End If
i = i + 1
Loop
DecodeUTF8 = s
End Function
Ссылки
Юникод на Википедии
Исходник для ASP+VBScript
UPD: Обработка ошибочных последовательностей и ошибка с типом Integer, который возвращает AscW.
Выбор кодировки текста при открытии и сохранении файлов
Как правило, при совместной работе с текстовыми файлами нет необходимости вникать в технические аспекты хранения текста. Однако если необходимо поделиться файлом с человеком, который работает с текстами на других языках, скачать текстовый файл из Интернета или открыть его на компьютере с другой операционной системой, может потребоваться задать кодировку при его открытии или сохранении.
Когда вы открываете текстовый файл в Microsoft Word или другой программе (например, на компьютере, язык операционной системы на котором отличается от того, на котором написан текст в файле), кодировка помогает программе определить, в каком виде нужно вывести текст на экран, чтобы его можно было прочитать.
В этой статье
-
Общие сведения о кодировке текста -
Выбор кодировки при открытии файла -
Выбор кодировки при сохранении файла -
Поиск кодировок, доступных в Word
Общие сведения о кодировке текста
Текст, который отображается в виде текста на экране, на самом деле сохраняется как числовые значения в текстовом файле. Компьютер переводит числовые значения в видимые символы. Для этого используется стандарт кодировки.
Кодировка — это схема нумерации, согласно которой каждому текстовому символу в наборе соответствует определенное числовое значение. Кодировка может содержать буквы, цифры и другие символы. В различных языках часто используются разные наборы символов, поэтому многие из существующих кодировок предназначены для отображения наборов символов соответствующих языков.
Различные кодировки для разных алфавитов
Сведения о кодировке, сохраняемые с текстовым файлом, используются компьютером для вывода текста на экран. Например, в кодировке «Кириллица (Windows)» знаку «Й» соответствует числовое значение 201. Когда вы открываете файл, содержащий этот знак, на компьютере, на котором используется кодировка «Кириллица (Windows)», компьютер считывает число 201 и выводит на экран знак «Й».
Однако если тот же файл открыть на компьютере, на котором по умолчанию используется другая кодировка, на экран будет выведен знак, соответствующий числу 201 в этой кодировке. Например, если на компьютере используется кодировка «Западноевропейская (Windows)», знак «Й» из исходного текстового файла на основе кириллицы будет отображен как «É», поскольку именно этому знаку соответствует число 201 в данной кодировке.
Юникод: единая кодировка для разных алфавитов
Чтобы избежать проблем с кодированием и декодированием текстовых файлов, можно сохранять их в Юникоде. В состав этой кодировки входит большинство знаков из всех языков, которые обычно используются на современных компьютерах.
Так как Word работает на базе Юникода, все файлы в нем автоматически сохраняются в этой кодировке. Файлы в Юникоде можно открывать на любом компьютере с операционной системой на английском языке независимо от языка текста. Кроме того, на таком компьютере можно сохранять в Юникоде файлы, содержащие знаки, которых нет в западноевропейских алфавитах (например, греческие, кириллические, арабские или японские).
К началу страницы
Выбор кодировки при открытии файла
Если в открытом файле текст искажен или выводится в виде вопросительных знаков либо квадратиков, возможно, Word неправильно определил кодировку. Вы можете указать кодировку, которую следует использовать для отображения (декодирования) текста.
-
Откройте вкладку Файл.
-
Нажмите кнопку Параметры.
-
Нажмите кнопку Дополнительно.
-
Перейдите к разделу Общие и установите флажокПодтверждать преобразование формата файла при открытии.
Примечание: Если установлен этот флажок, Word отображает диалоговое окно Преобразование файла при каждом открытии файла в формате, отличном от формата Word (то есть файла, который не имеет расширения DOC, DOT, DOCX, DOCM, DOTX или DOTM). Если вы часто работаете с такими файлами, но вам обычно не требуется выбирать кодировку, не забудьте отключить этот параметр, чтобы это диалоговое окно не выводилось. -
Закройте, а затем снова откройте файл.
-
В диалоговом окне Преобразование файла выберите пункт Кодированный текст.
-
В диалоговом окне Преобразование файла установите переключатель Другая и выберите нужную кодировку из списка.
В области Образец можно просмотреть текст и проверить, правильно ли он отображается в выбранной кодировке.
Если почти весь текст выглядит одинаково (например, в виде квадратов или точек), возможно, на компьютере не установлен нужный шрифт. В таком случае можно установить дополнительные шрифты.
Чтобы установить дополнительные шрифты, сделайте следующее:
-
Нажмите кнопку Пуск и выберите пункт Панель управления.
-
Выполните одно из указанных ниже действий.
В Windows 7-
На панели управления выберите элемент Удаление программ.
-
В списке программ щелкните Microsoft Office или Microsoft Word, если он был установлен отдельно от пакета Microsoft Office, и нажмите кнопку Изменить.
В Windows Vista-
На панели управления выберите раздел Удаление программы.
-
В списке программ щелкните Microsoft Office или Microsoft Word, если он был установлен отдельно от пакета Microsoft Office, и нажмите кнопку Изменить.
В Windows XP-
На панели управления щелкните элемент Установка и удаление программ.
-
В списке Установленные программы щелкните Microsoft Office или Microsoft Word, если он был установлен отдельно от пакета Microsoft Office, и нажмите кнопку Изменить.
-
-
В группе Изменение установки Microsoft Office нажмите кнопку Добавить или удалить компоненты и затем нажмите кнопку Продолжить.
-
В разделе Параметры установки разверните элемент Общие средства Office, а затем — Многоязыковая поддержка.
-
Выберите нужный шрифт, щелкните стрелку рядом с ним и выберите пункт Запускать с моего компьютера.
Совет: При открытии текстового файла в той или иной кодировке в Word используются шрифты, определенные в диалоговом окне Параметры веб-документа. (Чтобы вызвать диалоговое окно Параметры веб-документа, нажмите кнопку Microsoft Office, затем щелкните Параметры Word и выберите категорию Дополнительно. В разделе Общие нажмите кнопку Параметры веб-документа.) С помощью параметров на вкладке Шрифты диалогового окна Параметры веб-документа можно настроить шрифт для каждой кодировки.
К началу страницы
Выбор кодировки при сохранении файла
Если не выбрать кодировку при сохранении файла, будет использоваться Юникод. Как правило, рекомендуется применять Юникод, так как он поддерживает большинство символов большинства языков.
Если документ планируется открывать в программе, которая не поддерживает Юникод, вы можете выбрать нужную кодировку. Например, в операционной системе на английском языке можно создать документ на китайском (традиционное письмо) с использованием Юникода. Однако если такой документ будет открываться в программе, которая поддерживает китайский язык, но не поддерживает Юникод, файл можно сохранить в кодировке «Китайская традиционная (Big5)». В результате текст будет отображаться правильно при открытии документа в программе, поддерживающей китайский язык (традиционное письмо).
Примечание: Так как Юникод — это наиболее полный стандарт, при сохранении текста в других кодировках некоторые знаки могут не отображаться. Предположим, например, что документ в Юникоде содержит текст на иврите и языке с кириллицей. Если сохранить файл в кодировке «Кириллица (Windows)», текст на иврите не отобразится, а если сохранить его в кодировке «Иврит (Windows)», то не будет отображаться кириллический текст.
Если выбрать стандарт кодировки, который не поддерживает некоторые символы в файле, Word пометит их красным. Вы можете просмотреть текст в выбранной кодировке перед сохранением файла.
При сохранении файла в виде кодированного текста из него удаляется текст, для которого выбран шрифт Symbol, а также коды полей.
Выбор кодировки
-
Откройте вкладку Файл.
-
Выберите пункт Сохранить как.
Чтобы сохранить файл в другой папке, найдите и откройте ее.
-
В поле Имя файла введите имя нового файла.
-
В поле Тип файла выберите Обычный текст.
-
Нажмите кнопку Сохранить.
-
Если появится диалоговое окно Microsoft Office Word — проверка совместимости, нажмите кнопку Продолжить.
-
В диалоговом окне Преобразование файла выберите подходящую кодировку.
-
Чтобы использовать стандартную кодировку, выберите параметр Windows (по умолчанию).
-
Чтобы использовать кодировку MS-DOS, выберите параметр MS-DOS.
-
Чтобы задать другую кодировку, установите переключатель Другая и выберите нужный пункт в списке. В области Образец можно просмотреть текст и проверить, правильно ли он отображается в выбранной кодировке.
Примечание: Чтобы увеличить область отображения документа, можно изменить размер диалогового окна Преобразование файла.
-
-
Если появилось сообщение «Текст, выделенный красным, невозможно правильно сохранить в выбранной кодировке», можно выбрать другую кодировку или установить флажок Разрешить подстановку знаков.
Если разрешена подстановка знаков, знаки, которые невозможно отобразить, будут заменены ближайшими эквивалентными символами в выбранной кодировке. Например, многоточие заменяется тремя точками, а угловые кавычки — прямыми.
Если в выбранной кодировке нет эквивалентных знаков для символов, выделенных красным цветом, они будут сохранены как внеконтекстные (например, в виде вопросительных знаков).
-
Если документ будет открываться в программе, в которой текст не переносится с одной строки на другую, вы можете включить в нем жесткие разрывы строк. Для этого установите флажок Вставлять разрывы строк и укажите нужное обозначение разрыва (возврат каретки (CR), перевод строки (LF) или оба значения) в поле Завершать строки.
К началу страницы
Поиск кодировок, доступных в Word
Word распознает несколько кодировок и поддерживает кодировки, которые входят в состав системного программного обеспечения.
Ниже приведен список письменностей и связанных с ними кодировок (кодовых страниц).
|
|
|
---|---|---|
Многоязычная
|
Юникод (UCS-2 с прямым и обратным порядком байтов, UTF-8, UTF-7)
|
Стандартный шрифт для стиля «Обычный» локализованной версии Word
|
Арабская
|
Windows 1256, ASMO 708
|
Courier New
|
Китайская (упрощенное письмо)
|
GB2312, GBK, EUC-CN, ISO-2022-CN, HZ
|
SimSun
|
Китайская (традиционное письмо)
|
BIG5, EUC-TW, ISO-2022-TW
|
MingLiU
|
Кириллица
|
Windows 1251, KOI8-R, KOI8-RU, ISO8859-5, DOS 866
|
Courier New
|
Английская, западноевропейская и другие, основанные на латинице
|
Windows 1250, 1252-1254, 1257, ISO8859-x
|
Courier New
|
Греческая
|
Windows 1253
|
Courier New
|
Иврит
|
Windows 1255
|
Courier New
|
Японская
|
Shift-JIS, ISO-2022-JP (JIS), EUC-JP
|
MS Mincho
|
Корейская
|
Wansung, Johab, ISO-2022-KR, EUC-KR
|
Malgun Gothic
|
Тайская
|
Windows 874
|
Tahoma
|
Вьетнамская
|
Windows 1258
|
Courier New
|
Индийские: тамильская
|
ISCII 57004
|
Latha
|
Индийские: непальская
|
ISCII 57002 (деванагари)
|
Mangal
|
Индийские: конкани
|
ISCII 57002 (деванагари)
|
Mangal
|
Индийские: хинди
|
ISCII 57002 (деванагари)
|
Mangal
|
Индийские: ассамская
|
ISCII 57006
| |
Индийские: бенгальская
|
ISCII 57003
| |
Индийские: гуджарати
|
ISCII 57010
| |
Индийские: каннада
|
ISCII 57008
| |
Индийские: малаялам
|
ISCII 57009
| |
Индийские: ория
|
ISCII 57007
| |
Индийские: маратхи
|
ISCII 57002 (деванагари)
| |
Индийские: панджаби
|
ISCII 57011
| |
Индийские: санскрит
|
ISCII 57002 (деванагари)
| |
Индийские: телугу
|
ISCII 57005
|
-
Для использования индийских языков необходима их поддержка в операционной системе и наличие соответствующих шрифтов OpenType.
-
Для непальского, ассамского, бенгальского, гуджарати, малаялам и ория доступна только ограниченная поддержка.
К началу страницы
Руководство для начинающих по кодированию данных и символов
Когда я впервые начал работать с компьютерами, все было в коде ASCII ( Американский стандартный код для обмена информацией )
Однако сегодня, работая с сетевыми протоколами и сетевым программированием, вы столкнетесь с множеством схем кодирования данных и символов.
В этом руководстве мы рассмотрим базовых схем кодирования , используемых на компьютерах, а во второй части учебного курса мы рассмотрим, как данные передаются по сети.
Символы, целые числа, числа с плавающей запятой и т. Д.
При хранении и передаче данных вам необходимо будет представить следующие типы данных:
- Знаки и цифры, например A и 1
- Целые числа со знаком и без знака, длинные (32 бита) и короткие (16 бит)
- Одинарная и двойная с плавающей точкой
- Логическое, т.е. истинно и ложно
Так как же компьютер хранит букву А или цифру 1?
Как компьютер хранит число вроде 60101? или 62.0101?
Как передать букву A и т. Д. На другой компьютер по сети?
Компьютеры и кодировка символов
Чтобы сохранить текст как двоичные данные, вы должны указать для этого текста кодировку .
Системы
Computers могут использовать различные схемы кодирования символов.
Пока данные остаются на компьютере, действительно неважно, как они закодированы.
Однако для передачи данных между системами необходимо принять стандартную схему кодирования.
В 1968 году ASCII (Американский стандартный код для обмена информацией) был принят в качестве стандарта для кодирования текста для обмена данными.
ASCII
ASCII — это американский стандарт, разработанный для кодирования английских символов и знаков препинания, используемых на пишущих машинках и телетайпах той эпохи (1960-е годы).
ASCII использует 8 бит, хотя фактически используется только 7 бит.
Поскольку ASCII был разработан во время эксплуатации устройств телетайпа, он также содержит управляющих кодов , предназначенных для управления устройством телетайпа.
В таблице ниже представлены сводные данные о присвоении кодов.
Таблица ASCII — сводка кодов | |
Десятичное значение | Использовать |
0-31 | Контрольные коды |
32-127 | Печатные символы |
128-255 | Не используется |
ASCII Расширения
Поскольку ASCII не может кодировать символы, такие как знак фунта £ или общие символы, встречающиеся в немецком и других европейских языках, были разработаны различные расширения.
Эти расширения сохранили набор символов ASCII и использовали неиспользуемую часть адресного пространства и управляющие коды для дополнительных символов.
Наиболее распространенными из них являются windows 1252 и Latin-1 (ISO-8859).
Windows 1252 и 7-битный ASCII были наиболее широко используемыми схемами кодирования до 2008 года, когда UTF-8 стал наиболее распространенным.
ISO-8859-1, ISO-8859-15, Latin-1
ISO-8859 — это 8-битная кодировка символов, которая расширяет 7-битную схему кодирования ASCII и используется для кодирования большинства европейских языков.Подробности смотрите в вики.
ISO-8859-1 , также известный как Latin-1, является наиболее широко используемым, поскольку его можно использовать для большинства распространенных европейских языков, например немецкого, итальянского, испанского, французского и т. Д.
Это очень похоже на схему кодирования windows-1252, но не идентично см. — Сравнение символов в Windows-1252, ISO-8859-1, ISO-8859-15
Юникод
Из-за необходимости кодировать символы иностранного языка и другие графические символы были разработаны набор символов Unicode и схемы кодирования.
Наиболее распространенные схемы кодирования:
UTF-8 — наиболее часто используемая схема кодирования, используемая в современных компьютерных системах и компьютерных сетях.
Это схема кодирования переменной ширины, разработанная для обеспечения полной обратной совместимости с ASCII. Он использует от 1 до 4 байтов. — вики
Наборы символов и схемы кодирования
Разница между этими двумя терминами не всегда ясна, и термины, как правило, используются как взаимозаменяемые.
Набор символов — это список символов, тогда как схема кодирования — это то, как они представлены в двоичном формате.
Лучше всего это видно с Unicode.
В схемах кодирования UTF-8, UTF-16 и UTF-32 используется набор символов Unicode, но символы кодируются по-разному.
ASCII — это набор символов и схема кодирования.
Метка порядка байтов (BOM)
Метка порядка байтов (BOM) — это символ Unicode, U + FEFF , который появляется как магическое число в начале текстового потока и может сигнализировать о нескольких вещах программе, потребляющей текст: –Wiki
- Порядок байтов или порядок байтов текстового потока;
- Тот факт, что текстовый поток кодируется в Юникоде, с высокой степенью достоверности;
- В какой кодировке Unicode кодируется текстовый поток.
Спецификация отличается для текста в кодировке UTF-8, UTF-16 и UTF-32
Следующая таблица, взятая из Wiki, показывает это.
Редакторы спецификаций и текста
Обычно большинство редакторов обрабатывают спецификацию правильно, и она не отображается.
Программное обеспечение Microsoft, такое как Блокнот, добавляет спецификацию при сохранении данных как UTF-8 и не может интерпретировать текст без спецификации , если это не чистый ASCII.
Пример спецификации
На снимке экрана ниже показан простой текстовый файл, содержащий текст TEST в блокноте в кодировке UTF-8:
Вы должны заметить, что символы спецификации не отображаются.
Ниже представлен вывод простой программы Python, которая отображает содержимое файла, содержащего символы TEST (4 символа), сохраненные как ASCII , UTF-8 , UTF-16-BE и UTF- 16-ЛЭ
Ссылка — Знак порядка байтов (BOM) в HTML
Общие вопросы и ответы
Q-Как мне узнать, какая кодировка символов используется в файле?
A- Обычно вы этого не делаете, но некоторые текстовые редакторы, такие как notepad ++, отображают кодировку.Если вы получаете файл, который закодирован с использованием кодировки, отличной от ожидаемой, вы можете получить ошибку при попытке его чтения.
Q- Мой файл находится в формате ASCII, но он нормально декодируется с использованием декодера UTF-8. Это почему?
A- Поскольку UTF-8 обратно совместим с ASCII.
Целые числа и числа с плавающей запятой — большие и с прямым порядком байтов
Примечание: Поскольку UTF-16 и UTF-32 используют 2-байтовые или 4-байтовые целые числа, следующее применимо к кодированию текста с их использованием
Количество байтов, выделенных для типа Integer или float, зависит от системы.
Пункт
Tutorials охватывает это для языка программирования C , и я буду использовать его для иллюстрации
.
Если взять короткое целое число как 2 байта и длинное целое число как 4 байта.
Поскольку они используют несколько байтов, возникает несколько вопросов:
- Какой байт представляет собой наиболее значительную часть числа?
- При хранении в памяти, какой байт сохраняется первым
- При отправке по сети, какой байт отправляется первым.
Порядок байтов относится к последовательному порядку, в котором байты упорядочиваются в более крупные числовые значения при сохранении в памяти или при передаче по цифровым каналам.Порядок байтов
представляет интерес в информатике, потому что обычно используются два конфликтующих и несовместимых формата: слова могут быть представлены в формате с прямым порядком байтов или с прямым порядком байтов , в зависимости от того, какие биты, байты или другие компоненты упорядочены из большой конец (самый старший бит) или младший конец (младший бит.
В формате с прямым порядком байтов , всякий раз, когда адресуется память или отправляется / сохраняется слова побайтно, старший значащий байт — байт, содержащий самый старший бит — сохраняется сначала (имеет наименьший адрес) или отправляется первым, затем следующие байты сохраняются или отправляются в порядке убывания значимости, причем наименее значимый байт — тот, который содержит наименее значимый бит — сохраняется последним (имеет наивысший адрес) или отправляется последним.Вики
На приведенной ниже иллюстрации с использованием Python показано целое число 16, представленное как 4 байта с использованием порядка больших и младших байтов.
Порядок сетевых и системных байтов
Сетевой порядок байтов определяет порядок байтов при отправке данных по сети. (TCP / IP обычно Big Endian ).
Это означает, что старший байт отправляется первым.
Порядок байтов системы или хоста указывает на то, как байты располагаются при хранении в памяти хост-системы.
ОС Windows — Little Endian .
Ref- Bit and Byte Видео для заказа
Связанные руководства
Оцените? И используйте Комментарии, чтобы сообщить мне больше
[Всего: 9 Среднее: 4,8 / 5].
Категориальное кодирование с использованием Label-Encoding и One-Hot-Encoder | автор: Динеш Ядав
Во многих действиях, связанных с машинным обучением или наукой о данных, набор данных может содержать текстовые или категориальные значения (в основном нечисловые значения). Например, цветовая характеристика, имеющая такие значения, как красный, оранжевый, синий, белый и т. Д. План питания с такими значениями, как завтрак, обед, закуски, ужин, чай и т. Д. Некоторые алгоритмы, такие как CATBOAST, деревья решений могут очень хорошо обрабатывать категориальные значения, но большинство алгоритмов ожидают, что числовые значения позволят достичь самых современных результатов.
Изучая искусственный интеллект и машинное обучение, вы заметите, что большинство алгоритмов лучше работают с числовыми входами. Следовательно, основная проблема, с которой сталкивается аналитик, — это преобразовать текстовые / категориальные данные в числовые данные и при этом создать алгоритм / модель, чтобы понять из них. Нейронные сети, являющиеся основой глубокого обучения, ожидают, что входные значения будут числовыми.
Есть много способов преобразовать категориальные значения в числовые значения. Каждый подход имеет свои недостатки и влияет на набор функций.При этом я бы остановился на двух основных методах: One-Hot-Encoding и Label-Encoder. Оба этих кодировщика являются частью библиотеки SciKit-learn (одной из наиболее широко используемых библиотек Python) и используются для преобразования текстовых или категориальных данных в числовые данные, которые модель ожидает и с которыми лучше работает.
Фрагменты кода в этой статье будут относиться к Python, так как мне удобнее работать с Python. Если вам нужен R (еще один широко используемый язык машинного обучения), скажите об этом в комментариях.
Этот подход очень прост и включает в себя преобразование каждого значения в столбце в число.Рассмотрим набор данных мостов с именами столбцов, типы мостов которых имеют следующие значения. Хотя в наборе данных будет намного больше столбцов, чтобы понять кодировку меток, мы сосредоточимся только на одном категориальном столбце.
МОСТ-ТИП
Арка
Балка
Ферма
Консоль
Связанная арка
Подвеска
Трос
Мы решили кодировать текстовые значения, задав последовательность для каждого текстового значения, как показано ниже:
На этом мы завершили метка-кодирование переменного типа моста.Вот и все, о чем идет речь в кодировании этикеток. Но в зависимости от значений данных и типа данных, кодирование меток порождает новую проблему, поскольку оно использует последовательность номеров. Проблема с использованием числа в том, что они вводят соотношение / сравнение между собой. По всей видимости, нет никакой связи между различными типами мостов, но, глядя на число, можно подумать, что мост типа «Вантовый» имеет больший приоритет, чем мост типа «Арка». Алгоритм может неправильно понять, что данные имеют какую-то иерархию / порядок 0 <1 <2… <6 и могут дать в 6 раз больший вес в расчетах «Кабелю», чем типу моста «Арка».
Рассмотрим еще один столбец под названием «Уровень безопасности». Выполнение кодирования метки этого столбца также приводит к порядку / приоритету числа, но правильным образом. Здесь числовой порядок не выглядит нестандартным, и это имеет смысл, если алгоритм интерпретирует порядок безопасности 0 <1 <2 <3 <4, т.е. нет <низкий <средний <высокий <очень высокий.
Подход с использованием кодов категорий:
Этот подход требует, чтобы столбец категории имел тип данных «категория».По умолчанию нечисловой столбец имеет тип «объект». Поэтому, возможно, вам придется изменить тип на «категорию», прежде чем использовать этот подход.
# импортировать необходимые библиотеки
импортировать панды как pd
импортировать numpy как np # создать начальный фрейм данных
bridge_types = ('Arch', 'Beam', 'Truss', 'Cantilever', 'Tied Arch', 'Suspension', ' Cable ')
bridge_df = pd.DataFrame (bridge_types, columns = [' Bridge_Types ']) # преобразование типа столбцов в' категорию '
bridge_df [' Bridge_Types '] = bridge_df [' Bridge_Types '].astype ('category') # Назначение числовых значений и сохранение в другом столбце
bridge_df ['Bridge_Types_Cat'] = bridge_df ['Bridge_Types']. cat.codes
bridge_df
Использование подхода библиотеки sci-kit learn:
Другой распространенный подход, который многие аналитики данных выполняют кодирование меток, — это использование библиотеки SciKit learn.
import pandas as pd
import numpy as np
from sklearn.preprocessing import LabelEncoder # create initial dataframe
bridge_types = ('Arch', 'Beam', 'Truss', 'Cantilever', 'Tied Arch', 'Suspension' , 'Кабель')
bridge_df = pd.DataFrame (bridge_types, columns = ['Bridge_Types']) # создание экземпляра labelencoder
labelencoder = LabelEncoder () # Назначение числовых значений и сохранение в другом столбце
bridge_df ['Bridge_Types_Cat'] = labelencoder.fit_transform (bridge_df ['] Bridge )
bridge_df
bridge_df с категориальным столбцом и значениями столбца с закодированными метками.Кодеки
— Реестр кодеков и базовые классы — документация Python 3.8.6
Исходный код: Lib / codecs.py
Этот модуль определяет базовые классы для стандартных кодеков Python (кодировщики и
декодеры) и обеспечивает доступ к внутреннему реестру кодеков Python, который
управляет процессом поиска кодеков и обработки ошибок. Самые стандартные кодеки
текстовые кодировки, которые кодируют текст в байты,
но есть также кодеки, которые кодируют текст в текст, а байты — в
байты.Пользовательские кодеки могут кодировать и декодировать произвольные типы, но некоторые
функции модуля ограничены для использования специально с
текстовые кодировки или с кодеками, которые кодируют
байт
.
Модуль определяет следующие функции для кодирования и декодирования с помощью
любой кодек:
-
кодеков.
кодировать
( obj , encoding = ‘utf-8’ , errors = ‘strict’ ) Кодирует obj с использованием кодека, зарегистрированного для кодирования .
Ошибки могут быть заданы для установки желаемой схемы обработки ошибок. В
обработчик ошибок по умолчанию —'strict'
, что означает, что ошибки кодирования вызывают
ValueError
(или более специфичный подкласс кодека, например
UnicodeEncodeError
). Обратитесь к Базовым классам кодеков для получения дополнительной информации.
информация об обработке ошибок кодека.
-
кодеков.
декодировать
( obj , encoding = ‘utf-8’ , errors = ‘strict’ ) Декодирует obj с использованием кодека, зарегистрированного для кодирования .
Ошибки могут быть заданы для установки желаемой схемы обработки ошибок. В
обработчик ошибок по умолчанию —'strict'
, что означает, что ошибки декодирования вызывают
ValueError
(или более специфичный подкласс кодека, например
UnicodeDecodeError
). Обратитесь к Базовым классам кодеков для получения дополнительной информации.
информация об обработке ошибок кодека.
Полную информацию о каждом кодеке также можно посмотреть напрямую:
-
кодеков.
поиск
( кодировка ) Ищет информацию о кодеке в реестре кодеков Python и возвращает
CodecInfo
, как определено ниже.кодировки сначала ищутся в кэше реестра. Если не найден, список
сканируются зарегистрированные функции поиска. Если нетCodecInfo, объект
найдено, возникает ошибкаLookupError
. В противном случае объектCodecInfo
сохраняется в кеше и возвращается вызывающей стороне.
- класс
кодеков.
CodecInfo
( кодирует , декодирует , streamreader = Нет , streamwriter = Нет , incrementalencoder = Нет , incrementaldecoder = Нет , name = Нет ) Сведения о кодеке при поиске в реестре кодеков.Конструктор
аргументы хранятся в одноименных атрибутах:-
наименование
Название кодировки.
-
кодировать
-
декодировать
Функции кодирования и декодирования без сохранения состояния. Это должно быть
функции или методы, которые имеют тот же интерфейс, что и
методы кодекаencode ()
иdecode ()
экземпляры (см. Интерфейс кодека).
Ожидается, что функции или методы будут работать в режиме без сохранения состояния.
-
инкрементальный кодировщик
-
инкрементальный декодер
Классы инкрементального кодировщика и декодера или заводские функции.
Они должны предоставлять интерфейс, определенный базовыми классами
IncrementalEncoder
иIncrementalDecoder
,
соответственно. Дополнительные кодеки могут сохранять состояние.
-
стриминтер
-
потоковая передача
Классы записи и чтения потоков или фабричные функции.Они должны
предоставить интерфейс, определенный базовыми классами
StreamWriter
иStreamReader
соответственно.
Кодеки потока могут поддерживать состояние.
-
Чтобы упростить доступ к различным компонентам кодеков, модуль предоставляет
эти дополнительные функции, которые используют lookup ()
для поиска кодека:
-
кодеков.
getencoder
( кодировка ) Найдите кодек для данной кодировки и верните его функцию кодировщика.
Вызывает ошибку
LookupError
в случае, если кодировка не может быть найдена.
-
кодеков.
getdecoder
( кодировка ) Найдите кодек для данной кодировки и верните его функцию декодирования.
Вызывает ошибку
LookupError
в случае, если кодировка не может быть найдена.
-
кодеков.
getincrementalencoder
( кодировка ) Найдите кодек для данной кодировки и верните его инкрементный кодировщик
класс или фабричная функция.Вызывает ошибку
LookupError
в случае, если кодировка не может быть найдена или кодек
не поддерживает инкрементальный энкодер.
-
кодеков.
getincrementaldecoder
( кодировка ) Найдите кодек для данной кодировки и верните его инкрементный декодер
класс или фабричная функция.Вызывает ошибку
LookupError
в случае, если кодировка не может быть найдена или кодек
не поддерживает инкрементный декодер.
-
кодеков.
getreader
( кодировка ) Найдите кодек для данной кодировки и верните его
StreamReader
класс или фабричная функция.Вызывает ошибку
LookupError
в случае, если кодировка не может быть найдена.
-
кодеков.
getwriter
( кодировка ) Найдите кодек для данной кодировки и верните его
StreamWriter
класс или фабричная функция.Вызывает ошибку
LookupError
в случае, если кодировка не может быть найдена.
Пользовательские кодеки становятся доступными после регистрации подходящего поиска кодеков
функция:
.
Объявление кодировки символов в HTML
Целевая аудитория:
Авторы HTML (использующие редакторы или сценарии), разработчики сценариев (PHP, JSP и т. Д.), Менеджеры веб-проектов и все, кому нужно введение в то, как объявить кодировку символов в своем файле HTML.
Как мне объявить кодировку моего файла HTML?
Вы всегда должны указывать кодировку, используемую для страницы HTML или XML. Если вы этого не сделаете, вы рискуете, что символы в вашем контенте будут неправильно интерпретированы.Это не только вопрос удобства чтения человеком, все чаще машинам необходимо понимать и ваши данные. Объявление кодировки символов также необходимо для обработки символов, отличных от ASCII, введенных пользователем в формы, в URL-адресах, созданных сценариями, и т. Д. В этой статье описывается, как это сделать для файла HTML.
Если вам нужно лучше понять, что такое символы и кодировки символов, см. Статью Кодировки символов для начинающих . Для получения информации об объявлении кодировок для таблиц стилей CSS см. Объявления кодировки символов CSS .
Всегда объявляйте кодировку вашего документа с помощью элемента meta
с атрибутом charset
или с использованием атрибутов http-Equ
и content
(так называемые директивы pragma). Объявление должно полностью помещаться в первые 1024 байта в начале файла, поэтому лучше всего помещать его сразу после открывающего тега head
.
...
..
Неважно, что вы используете, но проще набрать первое. Также не имеет значения, набираете ли вы UTF-8
или utf-8
.
Всегда следует использовать кодировку символов UTF-8. (Помните, что это означает, что вам также нужно сохранить вашего контента как UTF-8.Посмотрите, что вам следует учитывать, если вы действительно не можете использовать UTF-8.
Если у вас есть доступ к настройкам сервера, вы также должны подумать, имеет ли смысл использовать HTTP-заголовок. Отметьте, однако, , что, поскольку заголовок HTTP имеет более высокий приоритет, чем мета-объявления в документе , авторы контента всегда должны учитывать, объявлена ли уже кодировка символов в заголовке HTTP. Если это так, должен быть установлен мета-элемент
для объявления той же кодировки.
Вы можете обнаружить любые кодировки, отправленные заголовком HTTP, с помощью средства проверки интернационализации.
А как насчет отметки порядка байтов?
Если у вас есть метка порядка байтов (BOM) UTF-8 в начале вашего файла, то последние версии браузера, отличные от Internet Explorer 10 или 11, будут использовать это, чтобы определить, что кодировка вашей страницы - UTF-8. Он имеет более высокий приоритет, чем любое другое объявление, включая заголовок HTTP.
Вы можете пропустить объявление кодировки meta
, если у вас есть спецификация, но мы рекомендуем вам сохранить его, поскольку это помогает людям, просматривающим исходный код, определить, какая кодировка страницы.
Подробнее о метке порядка байтов.
Должен ли я указывать кодировку в заголовке HTTP?
Используйте объявления кодировки символов в заголовках HTTP, если это имеет смысл, и если вы можете, для любого типа содержимого, , но в сочетании с объявлением в документе.
Авторы контента должны всегда обеспечивать соответствие деклараций HTTP декларациям в документе.
Плюсы и минусы использования HTTP-заголовка
Одним из преимуществ использования HTTP-заголовка является то, что пользовательские агенты могут быстрее находить информацию о кодировке символов, когда она отправляется в HTTP-заголовке.
Информация заголовка HTTP имеет наивысший приоритет, когда она конфликтует с декларациями в документе, отличными от отметки порядка байтов. Средний
серверы, которые перекодируют данные (т. е. конвертируют в другую кодировку), могут воспользоваться этим, чтобы изменить кодировку документа перед его отправкой на небольшие устройства, которые распознают только несколько
кодировки. Неясно, широко ли используется эта перекодировка в настоящее время. Если это так, и он преобразует контент в кодировку, отличную от UTF-8, существует высокий риск потери данных, и это не является хорошей практикой.
С другой стороны, есть ряд потенциальных недостатков:
Авторам контента может быть сложно изменить информацию о кодировке для статических файлов на сервере, особенно при работе с интернет-провайдером.
Авторам потребуются знания и доступ к настройкам сервера.Настройки сервера могут по тем или иным причинам не синхронизироваться с документом.Это может произойти, например, если вы
полагаться на сервер по умолчанию, и это значение по умолчанию будет изменено. Это очень плохая ситуация, поскольку более высокий приоритет информации HTTP по сравнению с
объявление в документе может сделать документ нечитаемым.Существуют потенциальные проблемы как для статических, так и для динамических документов, если они не читаются с сервера; например, если они сохранены в
место, такое как компакт-диск или жесткий диск.В этих случаях информация о кодировке из заголовка HTTP недоступна.Аналогично, если кодировка символов объявлена только в заголовке HTTP, эта информация больше не доступна для файлов во время редактирования или когда они
обрабатываются такими вещами, как XSLT или скрипты, или когда они отправляются на перевод и т. д.
Так следует ли мне использовать этот метод?
Если файлы обслуживаются через HTTP с сервера, отправка информации о кодировке символов документа в заголовке HTTP никогда не является проблемой, если эта информация верна.
С другой стороны, из-за перечисленных выше недостатков мы также рекомендуем всегда объявлять информацию о кодировке внутри документа. Объявление в документе также помогает разработчикам, тестировщикам или руководителям отдела переводов, которые хотят визуально проверить кодировку документа.
(Некоторые люди утверждают, что объявлять кодировку в HTTP-заголовке бывает уместно, если вы собираетесь повторить ее в
содержание документа.В этом случае они предлагают, чтобы HTTP-заголовок ничего не говорил о кодировке документа. Обратите внимание, что это обычно означает
принятие мер, чтобы отключить любые настройки сервера по умолчанию.)
Работа с полиглотами и форматами XML
XHTML5: Документ XHTML5 обслуживается как XML и имеет синтаксис XML. Анализаторы XML не распознают объявления кодировки в мета-элементах
. Они распознают только декларацию XML. Вот пример:
Xml version = "1.0 "encoding =" utf-8 "?>
Объявление XML требуется только в том случае, если страница не обслуживается как UTF-8 (или UTF-16), но может быть полезно включить его, чтобы разработчики, тестировщики или менеджеры по производству переводов могли визуально проверить кодировку документ, посмотрев на источник.
Разметка полиглота: Страница, которая использует разметку полиглота, использует подмножество HTML с синтаксисом XML, которое может быть проанализировано с помощью синтаксического анализатора HTML или XML.Он описан в «Разметка полиглотов: надежный профиль словаря HTML5».
Поскольку документ полиглота должен быть в кодировке UTF-8, вам не нужно и даже не следует использовать объявление XML. С другой стороны, если файл должен читаться как HTML, вам нужно будет объявить кодировку, используя мета-элемент
, метку порядка байтов или заголовок HTTP.
Поскольку объявление в мета-элементе
будет распознаваться только анализатором HTML, если вы используете подход с атрибутом content
, его значение должно начинаться с text / html;
.
Если вы используете мета-элемент
с атрибутом кодировки
, это не то, что вам нужно учитывать.
Информация в этом разделе относится к вещам, о которых вам обычно не нужно знать, но которые включены сюда для полноты.
Работа с кодировками, отличными от UTF-8
Использование UTF-8 не только упрощает создание страниц, но и позволяет избежать неожиданных результатов при отправке формы и кодировках URL-адресов, которые по умолчанию используют кодировку символов документа.Если вы действительно не можете избежать использования кодировки символов, отличной от UTF-8, вам нужно будет выбрать из ограниченного набора имен кодировки, чтобы обеспечить максимальную совместимость и максимально длительный срок читабельности вашего контента.
Хотя они обычно называются именами кодировки ,
в действительности они относятся к кодировкам, а не к наборам символов. Например, набор символов Unicode или «репертуар» может быть закодирован в трех различных схемах кодирования.
До недавнего времени реестр IANA был местом, где можно было найти имена для кодировок.Реестр IANA обычно включает несколько имен для одной и той же кодировки. В этом случае вы должны использовать имя, обозначенное как
"предпочтительный".
Новая спецификация Encoding теперь предоставляет список, который был протестирован на реальных реализациях браузеров. Вы можете найти список в таблице в разделе «Кодировки». Лучше всего использовать имена из левого столбца этой таблицы.
Обратите внимание на , однако, что наличие имени в любом из этих источников не обязательно означает, что можно использовать эту кодировку.Некоторые кодировки проблематичны. Если вы действительно не можете использовать UTF-8, вам следует внимательно изучить совет из статьи Выбор и применение кодировки символов .
Не придумывайте свои собственные имена кодировок, которым предшествует x-
. Это плохая идея, так как она
ограничивает совместимость.
Работа с устаревшими форматами HTML
HTML 4.01 не определяет использование атрибута charset
с мета-элементом
, но любой недавний крупный браузер все равно обнаружит и использует его, даже если страница объявлена как HTML4, а не HTML5.Этот раздел актуален только в том случае, если у вас есть другая причина, кроме обслуживания браузера для соответствия более старому формату HTML. Он описывает любые отличия от раздела ответов выше.
Информацию о страницах, обслуживаемых как XML, см. В разделе Работа с многоязычными форматами и XML.
HTML4: Как уже упоминалось выше, для полного соответствия HTML 4.01 вам необходимо использовать директиву pragma, а не атрибут charset
.
XHTML 1.x используется как text / html: Также требуется директива pragma для полного соответствия HTML 4.01, а не атрибут charset
. Вам не нужно использовать объявление XML, поскольку файл обслуживается как HTML.
XHTML 1.x служил XML: Используйте объявление в кодировке объявления XML в первой строке страницы. Убедитесь, что перед ним ничего нет, включая пробелы (хотя отметка порядка байтов в порядке).
Атрибут charset ссылки
HTML5 не рекомендует использовать атрибут charset
в элементе a
или link
, поэтому вам следует избегать его использования.Он возник в спецификации HTML 4.01 для использования с элементами a
, link
и script
и должен был указывать кодировку документа, на который вы ссылаетесь.
Он был предназначен для использования во встроенном элементе ссылки, например:
Плохой код. Не копируйте!
См. Наш список публикаций .
Идея заключалась в том, что браузер сможет применить правильную кодировку к документу, который он извлекает, если никакая другая кодировка не указана для документа.
Всегда были проблемы с использованием этого атрибута. Во-первых, он плохо поддерживается основными браузерами. Одна из причин не поддерживать этот атрибут заключается в том, что, если браузеры будут делать это без специальных дополнительных правил, это будет вектор атаки XSS. Во-вторых, трудно гарантировать, что информация верна в любой момент времени. Автор указанного документа вполне может изменить кодировку документа без вашего ведома. Если автор все еще не указал кодировку своего документа, вы теперь попросите браузер применить неправильную кодировку.И, в-третьих, в этом нет необходимости, если люди следуют рекомендациям из этой статьи и правильно размечают свои документы. Это гораздо лучший подход.
Этот способ указания кодировки документа имеет самый низкий приоритет (т. Е. Если кодировка объявлена каким-либо другим способом, это будет проигнорировано). Это означает, что вы также не можете использовать это для исправления неверных объявлений.
Работа с UTF-16
По результатам выборки Google из нескольких миллиардов страниц, меньше 0.01% страниц в Интернете закодированы в UTF-16. На UTF-8 приходится более 80% всех веб-страниц, если вы включаете его подмножество, ASCII, и более 60%, если вы этого не делаете. Настоятельно не рекомендуется использовать UTF-16 в качестве кодировки страницы.
Если по какой-то причине у вас нет выбора, вот несколько правил объявления кодировки. Они отличаются от кодировок для других кодировок.
Спецификация HTML5 запрещает использование мета-элемента
для объявления UTF-16, поскольку значения должны быть совместимы с ASCII.Вместо этого вы должны убедиться, что у вас всегда есть метка порядка байтов в самом начале файла в кодировке UTF-16. По сути, это декларация в документе.
Кроме того, если ваша страница закодирована как UTF-16, не объявляйте файл как «UTF-16BE» или «UTF-16LE», используйте только «UTF-16». Отметка порядка байтов в начале вашего файла укажет, является ли схема кодирования прямым или обратным порядком байтов. (Это связано с тем, что содержимое, явно закодированное, например, как UTF-16BE, не должно использовать метку порядка байтов; но HTML5 требует метки порядка байтов для страниц в кодировке UTF-16.)
.