Кодировки текстовых файлов

То, что отображается на экране как текст, фактически хранится в текстовом файле в виде последовательность числовых значений, которые будут преобразованы в видимые символы.

Кодировка — это соглашение, согласно которому каждому текстовому символу соответствует  кодовая последовательность, позволяющая осуществить обратное соответствие к тому же текстовому символу.

Метка последовательности байт BOM (Byte Order Mark)

Текстовые файлы использующие кодировки UTF могут в первых байтах содержать метку BOM, которая точно устанавливает примененный способ кодирования. При отсутствии метки BOM распознать метод придется по косвенным признакам.

Длина последовательности BOM составляет от 2 до 4 байт в зависимости от вида кодировки из таблицы ниже (колонки 3-6 содержат отображение BOM при ошибочном выборе кодировок ISO-8859-1, KOI8-R, CP1251, CP866):

Code BOM ISO KOI8-R CP1251 CP866
UTF-8 EF BB BF  О╩© п»ї я╗┐
UTF-16 (BE) FE FF þÿ ЧЪ юя
UTF-16 (LE) FF FE ÿþ ЪЧ яю  ■
UTF-32 (BE) 00 00 FE FF ␀␀þÿ ␀␀ЧЪ ␀␀юя ␀␀■
UTF-32 (LE) FF FE 00 00 ÿþ␀␀ ЪЧ␀␀ яю␀␀  ■␀␀

Внутренний формат Windows — UTF-16 LE.
Внутренний формат Unix — UTF-8.
Стандарт Encoding Standard рекомендует применять UTF-8.

BOM других кодировок UTF-7, UTF-1, UTF-EBCDIC, SCSU, BOCU-1, GB-18030 описаны тут: //en.wikipedia.org/wiki/Byte_order_mark

Порядок байт BE/LE

Последовательность размещения в файле байт каждого utf-кода предполагает два способа:

  • BE (big-endian) — старший байт завершает;
  • LE (little-endian) — младший байт завершает.

Конец строки EOL

Завершение строки в текстовом файле отмечается специальной последовательностью, которая может включать символы

EOL HEX Char Char Comment
CR 0A \r Macintosh Возврат каретки (Carriage Return)
LF 0D \n Unix Перевод строки (Line Feed)
CRLF 0A 0D \n Windows

Правила написания серверного кода PHP и кроссплатформенные системы, как Git, прямо предписывают использовать в файлах LF (\n).

Кодирование символов

UTF-8

В кодировании UTF-8 используется код переменной длины от 1 до 4, в зависимости от диапазона:

code Range Byte 1 Byte 2 Byte 3 Byte 4 Comment
U+0000..U+007F 0xxxxxxx ASCII (128)
U+0080..U+07FF 110xxxxx 10xxxxxx (1920)
U+0800..U+FFFF 1110xxxx 10xxxxxx 10xxxxxx (61440)
U+10000..U+10FFFF 11110xxx 10xxxxxx 10xxxxxx 10xxxxxx (1048576)

Источники

Маркер последовательности байтов //ru.wikipedia.org

Leave a Reply