Java: Кодировки

На самом нижнем уровне компьютер работает только с нулями и единицами. Это двоичный код. Каждый ноль или единицу называют битом (от binary digit, "двоичная цифра").

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

  • 0 → 0
  • 1 → 1
  • 2 → 10

Как закодировать текст

Компьютер не "понимает" буквы. Чтобы хранить текст, символы превращают в числа. Этим занимаются кодировки. Кодировка это таблица, где каждому символу соответствует определенное число.

Самый прямой способ состоит в том, чтобы пронумеровать буквы, начиная с единицы:

  • a1
  • b2
  • ...и так до z26

Теперь слово hello превращается в набор чисел:

h e l l o
↓ ↓ ↓  ↓  ↓
8 5 12 12 15

Программа не знает, что перед ней слово. Она видит инструкцию "покажи символ с кодом 8, потом с кодом 5" и так далее. Слово good в той же таблице превратится в коды 7, 15, 15 и 4.

ASCII. Первая массовая кодировка

Первые компьютеры работали в основном с английским языком. Для него в 1960-х годах придумали таблицу ASCII на 128 символов. В нее вошли латинский алфавит, цифры, знаки препинания, спецсимволы вроде @, #, ! и управляющие коды.

Для ранних программ этого хватало, но не для всего мира. Когда компьютеры пришли в другие страны, возникла проблема. В ASCII нет кириллицы, иероглифов, арабского письма, ударений и валютных символов.

Тогда каждая страна или компания стала делать свою таблицу на основе ASCII. Windows придумала Windows-1251 для русского, Apple создала Mac Roman, в Азии и на Ближнем Востоке появились свои варианты.

Эти таблицы были несовместимы между собой. Код 226 в одной кодировке означал букву é, в другой совсем другой символ. Текст, записанный одной таблицей и прочитанный другой, превращался в мусор.

Кракозябры

Если в тексте вместо слов появляется вот такое:

ÐÑивеÑ

это значит, что программа прочитала байты не той таблицей. Она получила набор чисел, но сопоставила их с неверными символами. В 1990-х и 2000-х такое случалось постоянно.

Unicode и UTF-8

Чтобы свести все таблицы к одной, в 1990-х начали создавать Unicode. Это общая таблица, куда попали символы всех письменных систем мира. В ней есть латиница и кириллица, китайское и арабское письмо, математические знаки, древние алфавиты и даже эмодзи.

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

Сегодня UTF-8 стоит по умолчанию в интернете, в Linux, в базах данных и редакторах кода. Java хранит текст в Unicode, поэтому буквы любого языка и символы вроде © или выводятся одинаково в любой системе.

Зачем это знать

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

Задание

Используя System.out.println(), выведите на экран строку со знаком авторского права:

© 2024 Hexlet

Символ © не входит в ASCII, но Java хранит текст в Unicode, поэтому он выводится без дополнительных настроек.

Полезное

Команда проекта находится в телеграм-сообществе. Там можно задать любой вопрос и повлиять на проект

Нашли ошибку? Есть что добавить? Пулреквесты приветствуются