Kodokon kodokon.com

Кириллица, UTF-8 и концы строк

Пойми, почему буквы иногда превращаются в кракозябры и что скрывают невидимые концы строк.

7 мин · 3 вопросов

Открыть этот урок в Kodokon

Машина понятия не имеет, что такое буква A. Она оперирует только числами. Поэтому, чтобы записывать текст, всем пришлось договориться о таблице соответствия: число 65 означает A, 66 означает B, и так далее. Такое соглашение называется кодировкой. Самая старая из них, ASCII, появилась в 1960-х и покрывала только английский алфавит: ни é, ни ç, ни ü, ни единой русской или китайской буквы.

Тогда каждая страна изобрела свою собственную таблицу, и наступил хаос: русский файл, открытый с западноевропейской таблицей, превращался в бессмыслицу, и наоборот. Современное решение называется Unicode - единый каталог, который присваивает номер каждому символу всех языков, включая эмодзи. А UTF-8 - это стандартный способ записать эти номера в файл. Сегодня правило простое и без исключений: всегда сохраняй свои файлы в UTF-8.

TEXT
Записан в UTF-8, прочитан как UTF-8    ->  Creme brulee (всё на месте)
Записан в UTF-8, прочитан как Latin-1  ->  Crème brûlée
Записан в Latin-1, прочитан как UTF-8  ->  Cr?me br?l?e
Один и тот же файл, прочитанный не с той таблицей, превращается в кракозябры.

Вторая невидимая вещь - конец строки. Когда ты нажимаешь Enter, в файле не рисуется никакая линия. Вместо этого добавляются один или два невидимых символа, и здесь системы тоже так и не договорились между собой. macOS и Linux используют один символ, LF (line feed, перевод строки), который записывают как \n. Windows использует два подряд, CRLF (carriage return, возврат каретки, затем line feed), который записывают как \r\n. Это пришло прямиком от пишущих машинок, где требовалось два отдельных движения: вернуть каретку назад, а затем прокрутить лист на строку вниз.

TEXT
Что ты видишь на экране:

Привет
Как дела

Что на самом деле лежит в файле:

macOS / Linux (LF)     Привет\nКак дела
Windows (CRLF)         Привет\r\nКак дела
Два файла, одинаковых на экране, и два разных содержимого на самом деле.

Проверка знаний

Убедись, что запомнил ключевые моменты этого урока.

  1. Что происходит, когда é показывается как é?
    • Файл читают в другой кодировке, не в той, в которой его записали
    • Файл повреждён, и его придётся создать заново
    • Система удалила диакритический знак
    • Не хватает шрифта
  2. Какой конец строки Windows использует исторически?
    • CRLF
    • LF
    • Только CR
  3. Какие настройки стоит выбрать в редакторе кода?
    • UTF-8 для кодировки и LF для концов строк
    • ASCII для кодировки и CRLF для концов строк
    • Latin-1 для кодировки и CR для концов строк