Представление символов, таблицы кодировок — различия между версиями
Ruslan (обсуждение | вклад) |
|||
Строка 52: | Строка 52: | ||
Также возможны коды длиной в 5 и 6 байт, но на практике они не используются. Это связано с тем, что в стандарт Unicode не входят символы с кодом выше <code>0x10ffff</code>. | Также возможны коды длиной в 5 и 6 байт, но на практике они не используются. Это связано с тем, что в стандарт Unicode не входят символы с кодом выше <code>0x10ffff</code>. | ||
+ | |||
+ | ==BOM== | ||
+ | |||
+ | |||
+ | |||
+ | '''Byte Order Mark (BOM)''' - Unicode символ, используемый для индикации порядка байтов (порядка байт) текстового файла. Его кодовый символ U+FEFF. По спецификации его использование не является обязательным, однако если BOM используется, то он должен быть установлен вначале текстового файла. Помимо своего конкретного использования в качестве указателя порядка байтов, символ может также указать какой кодировкой Unicode закодирован текст. | ||
+ | |||
+ | Кодировка Unicode может использовать 16-битные или 32-разрядных числа и приложение должно знать как дальше с ним поступать. Поэтому потребность в BOM возникает при обмене документами. | ||
+ | |||
+ | == Использование == | ||
+ | В потоке данных UTF-16 старший байт может записываться либо перед младшим (англ. UTF-16 big-endian), либо после младшего (англ. UTF-16 little-endian). Аналогично существует два варианта четырёхбайтной кодировки — UTF-32BE и UTF-32LE. | ||
+ | |||
+ | Для определения формата представления Юникода в текстовом файле используется приём, по которому в начале текста записывается символ U+FEFF (неразрывный пробел с нулевой шириной), также именуемый меткой порядка байтов (англ. byte order mark, BOM). Этот способ позволяет различать UTF-16LE и UTF-16BE, поскольку символа U+FFFE не существует. Также он иногда применяется для обозначения формата UTF-8, хотя к этому формату и неприменимо понятие порядка байтов. | ||
+ | == Представление кодировки Byte order marks == | ||
+ | {| class="wikitable" | ||
+ | |- | ||
+ | ! Кодирование | ||
+ | ! Представление (Шестнадцатеричная) | ||
+ | ! Представление (Десятичная) | ||
+ | ! Представление (ISO-8859-1) | ||
+ | |- | ||
+ | | UTF-8 | ||
+ | | <code>EF BB BF</code> | ||
+ | | <code>239 187 191</code> | ||
+ | | <code></code> | ||
+ | |- | ||
+ | | UTF-16 ([[Big Endian|BE]]) | ||
+ | | <code>FE FF</code> | ||
+ | | <code>254 255</code> | ||
+ | | <code>þÿ</code> | ||
+ | |- | ||
+ | | UTF-16 ([[Little Endian|LE]]) | ||
+ | | <code>FF FE</code> | ||
+ | | <code>255 254</code> | ||
+ | | <code>ÿþ</code> | ||
+ | |- | ||
+ | | UTF-32 (BE) | ||
+ | | <code>00 00 FE FF</code> | ||
+ | | <code>0 0 254 255</code> | ||
+ | | <code>□□þÿ</code> (□ ASCII символ нуль) | ||
+ | |- | ||
+ | | UTF-32 (LE) | ||
+ | | <code>FF FE 00 00</code> | ||
+ | | <code>255 254 0 0</code> | ||
+ | | <code>ÿþ□□</code> (□ ASCII символ нуль) | ||
+ | |- | ||
+ | | UTF-7 | ||
+ | | <code>2B 2F 76 38<br>2B 2F 76 39<br>2B 2F 76 2B<br>2B 2F 76 2F</code><ref group="t">In UTF-7, the fourth byte of the BOM, before encoding as [[base64]], is <code>001111xx</code> in binary, and <code>xx</code> depends on the next character (the first character after the BOM). Hence, technically, the fourth byte is not purely a part of the BOM, but also contains information about the next (non-BOM) character. For <code>xx=00</code>, <code>01</code>, <code>10</code>, <code>11</code>, this byte is, respectively, <code>38</code>, <code>39</code>, <code>2B</code>, or <code>2F</code> when encoded as base64. If no following character is encoded, <code>38</code> is used for the fourth byte and the following byte is <code>2D</code>.</ref> | ||
+ | | <code>43 47 118 56<br>43 47 118 57<br>43 47 118 43<br>43 47 118 47</code> | ||
+ | | <code>+/v8<br>+/v9<br>+/v+<br>+/v/</code> | ||
+ | |- | ||
+ | | UTF-1<ref name=b group=t/> | ||
+ | | <code>F7 64 4C</code> | ||
+ | | <code>247 100 76</code> | ||
+ | | <code>÷dL</code> | ||
+ | |- | ||
+ | | UTF-EBCDIC<ref name=b group=t/> | ||
+ | | <code>DD 73 66 73</code> | ||
+ | | <code>221 115 102 115</code> | ||
+ | | <code>Ýsfs</code> | ||
+ | |- | ||
+ | | Standard Compression Scheme for Unicode|SCSU<ref name=b group=t/> | ||
+ | | <code>0E FE FF</code>{{#tag:ref|SCSU allows other encodings of U+FEFF, the shown form is the signature recommended in UTR #6.</ref>|group=t}} | ||
+ | | <code>14 254 255</code> | ||
+ | | <code>□þÿ</code> (□ ASCII "shift out" символ) | ||
+ | |- | ||
+ | | BOCU-1<ref name=b group=t/> | ||
+ | | <code>FB EE 28 | ||
+ | | <code>251 238 40</code> | ||
+ | | <code>ûî</code> | ||
+ | |- | ||
+ | | GB-18030<ref name=b group=t/> | ||
+ | | <code>84 31 95 33</code> | ||
+ | | <code>132 49 149 51</code> | ||
+ | | <code>□1■3</code> (□ и ■ несопоставленные ISO-8859-1 символы) | ||
+ | |} | ||
+ | К сожалению, этот способ не позволяет надёжно различать UTF-16LE и UTF-32LE, поскольку символ U+0000 допускается Юникодом (хотя реальные тексты редко начинаются с него). | ||
== Ссылки == | == Ссылки == | ||
− | [http://ru.wikipedia.org/wiki/ASCII Wikipedia: таблица ASCII] | + | * [http://ru.wikipedia.org/wiki/ASCII Wikipedia: таблица ASCII] |
− | + | * [http://ru.wikipedia.org/wiki/%D0%AE%D0%BD%D0%B8%D0%BA%D0%BE%D0%B4 Wikipedia: стандарт UNICODE] | |
− | [http://ru.wikipedia.org/wiki/%D0%AE%D0%BD%D0%B8%D0%BA%D0%BE%D0%B4 Wikipedia: стандарт UNICODE] | + | * [http://ru.wikipedia.org/wiki/Byte_order_mark Wikipedia: Byte order mark] |
+ | * [http://ru.wikipedia.org/wiki/%D0%AE%D0%BD%D0%B8%D0%BA%D0%BE%D0%B4 Wikipedia: Юникод] | ||
[[Категория: Дискретная математика и алгоритмы]] | [[Категория: Дискретная математика и алгоритмы]] | ||
[[Категория: Представление информации]] | [[Категория: Представление информации]] |
Версия 00:39, 25 октября 2011
Содержание
Представление символов в вычислительных машинах
В вычислительных машинах символы не могут храниться иначе, как в виде последовательностей битов (как и числа). Для передачи символа и его корректного отображения ему должна соответствовать уникальная последовательность нулей и единиц. Для этого были разработаны таблицы кодировок.
Количество символов, которые можно задать последовательностью битов длины n, задается простой формулой
. Таким образом, от нужного количества символов напрямую зависит количество используемой памяти.Таблицы кодировок
На заре компьютерной эры на каждый символ было отведено по 5 бит. Это было связано с малым количеством оперативной памяти на компьютерах тех лет. В эти 64 символа входили только управляющие символы и строчные буквы английского алфавита.
С ростом производительности компьютеров стали появляться таблицы кодировок с большим количеством символов. Первой 7 битной кодировкой стала ASCII7. В нее уже вошли прописные буквы английского алфавита, арабские цифры, знаки препинания. Затем на ее базе была разработана ASCII8, в которым уже стало возможным хранение 256 символов: 128 основных и еще столько же расширенных. Первая часть таблицы осталась без изменений, а вторая может иметь различные варианты (каждый имеет свой номер). Эта часть таблицы стала заполняться символами национальных алфавитов.
Определение: |
ASCII - таблицы кодировок, в которых содержатся основные символы (английский алфавит, цифры, знаки препинания, символы национальных алфавитов(свои для каждого региона), служебные символы) и длина кода каждого символа | бит.
Но для многих языков (например, арабского, японского, китайского) 256 символов недостаточно, поэтому развитие кодировок продолжалось, что привело к появлению UNICODE.
Определение: |
UNICODE - таблицы кодировок, в которых содержатся все используемые символы и длина кода каждого символа | бит.
Наиболее известные кодировки
7 бит:
- ASCII7 - первая кодировка, пригодная для работы с текстом. Помимо маленьких букв английского алфавита и служебных символов, содержит большие буквы английского языка, цифры, знаки препинания и другие символы.
Кодировки стандарта ASCII (8 бит):
- ASCII - первая кодировка, в которой стало возможно использовать символы национальных алфавитов.
- КОИ8-R - первая русская кодировка. Символы кириллицы расположены не в алфавитном порядке. Их разместили в верхнюю половину таблицы так, чтобы позиции кириллических символов соответствовали их фонетическим аналогам в английском алфавите. Это значит, что даже при потере старшего бита каждого символа, например, при проходе через устаревший семибитный модем, текст остается "читаемым".
- CP866 - русская кодировка, использовавшаяся на компьютерах IBM в системе DOS.
- Windows-1251 - русская кодировка, использовавшаяся в русскоязычных версиях операционной системы Windows в начале 90-х годов. Кириллические символы идут в алфавитном порядке. Содержит все символы, встречающиеся в типографике обычного текста (кроме знака ударения).[1]
Кодировки стандарта UNICODE:
- UTF8 - самая распространенная на данный момент кодировка из семейства UNICODE. [2]
Unicode | UTF-8 | Представленные символы |
---|---|---|
0x00000000 — 0x0000007F |
0xxxxxxx |
ASCII, в том числе английский алфавит, простейшие знаки препинания и арабские цифры |
0x00000080 — 0x000007FF |
110xxxxx 10xxxxxx |
кириллица, расширенная латиница, арабский алфавит, армянский алфавит, греческий алфавит, еврейский алфавит и коптский алфавит; сирийское письмо, тана, нко; Международный фонетический алфавит; некоторые знаки препинания |
0x00000800 — 0x0000FFFF |
1110xxxx 10xxxxxx 10xxxxxx |
все другие современные формы письменности, в том числе грузинский алфавит, индийское, китайское, корейское и японское письмо; сложные знаки препинания; математические и другие специальные символы |
0x00010000 — 0x001FFFFF |
11110xxx 10xxxxxx 10xxxxxx 10xxxxxx |
музыкальные символы, редкие китайские иероглифы, вымершие формы письменности |
111111xx |
служебные символы c, d, e, f |
Также возможны коды длиной в 5 и 6 байт, но на практике они не используются. Это связано с тем, что в стандарт Unicode не входят символы с кодом выше 0x10ffff
.
BOM
Byte Order Mark (BOM) - Unicode символ, используемый для индикации порядка байтов (порядка байт) текстового файла. Его кодовый символ U+FEFF. По спецификации его использование не является обязательным, однако если BOM используется, то он должен быть установлен вначале текстового файла. Помимо своего конкретного использования в качестве указателя порядка байтов, символ может также указать какой кодировкой Unicode закодирован текст.
Кодировка Unicode может использовать 16-битные или 32-разрядных числа и приложение должно знать как дальше с ним поступать. Поэтому потребность в BOM возникает при обмене документами.
Использование
В потоке данных UTF-16 старший байт может записываться либо перед младшим (англ. UTF-16 big-endian), либо после младшего (англ. UTF-16 little-endian). Аналогично существует два варианта четырёхбайтной кодировки — UTF-32BE и UTF-32LE.
Для определения формата представления Юникода в текстовом файле используется приём, по которому в начале текста записывается символ U+FEFF (неразрывный пробел с нулевой шириной), также именуемый меткой порядка байтов (англ. byte order mark, BOM). Этот способ позволяет различать UTF-16LE и UTF-16BE, поскольку символа U+FFFE не существует. Также он иногда применяется для обозначения формата UTF-8, хотя к этому формату и неприменимо понятие порядка байтов.
Представление кодировки Byte order marks
Кодирование | Представление (Шестнадцатеричная) | Представление (Десятичная) | Представление (ISO-8859-1) |
---|---|---|---|
UTF-8 | EF BB BF
|
239 187 191
|

|
UTF-16 (BE) | FE FF
|
254 255
|
þÿ
|
UTF-16 (LE) | FF FE
|
255 254
|
ÿþ
|
UTF-32 (BE) | 00 00 FE FF
|
0 0 254 255
|
□□þÿ (□ ASCII символ нуль)
|
UTF-32 (LE) | FF FE 00 00
|
255 254 0 0
|
ÿþ□□ (□ ASCII символ нуль)
|
UTF-7 | 2B 2F 76 38 [t 1]
|
43 47 118 56
|
+/v8
|
UTF-1[t 2] | F7 64 4C
|
247 100 76
|
÷dL
|
UTF-EBCDIC[t 2] | DD 73 66 73
|
221 115 102 115
|
Ýsfs
|
SCSU[t 2] | 0E FE FF [t 3]
|
14 254 255
|
□þÿ (□ ASCII "shift out" символ)
|
BOCU-1[t 2] | FB EE 28
|
<code>251 238 40 | ûî
|
GB-18030[t 2] | 84 31 95 33
|
132 49 149 51
|
□1■3 (□ и ■ несопоставленные ISO-8859-1 символы)
|
К сожалению, этот способ не позволяет надёжно различать UTF-16LE и UTF-32LE, поскольку символ U+0000 допускается Юникодом (хотя реальные тексты редко начинаются с него).
Ссылки
Ошибка цитирования Для существующих тегов <ref>
группы «t» не найдено соответствующего тега <references group="t"/>
или пропущен закрывающий тег </ref>