Java: Кодировки
На самом нижнем уровне компьютер работает только с нулями и единицами. Это двоичный код. Каждый ноль или единицу называют битом (от binary digit, "двоичная цифра").
Любые данные внутри компьютера это последовательность битов. Так хранятся изображения, музыка и текст. Привычные числа из десятичной системы тоже представимы в двоичном виде:
- 0 →
0 - 1 →
1 - 2 →
10
Как закодировать текст
Компьютер не "понимает" буквы. Чтобы хранить текст, символы превращают в числа. Этим занимаются кодировки. Кодировка это таблица, где каждому символу соответствует определенное число.
Самый прямой способ состоит в том, чтобы пронумеровать буквы, начиная с единицы:
a→1b→2- ...и так до
z→26
Теперь слово 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, поэтому он выводится без дополнительных настроек.
Полезное
Java: Кодировки
На самом нижнем уровне компьютер работает только с нулями и единицами. Это двоичный код. Каждый ноль или единицу называют битом (от binary digit, "двоичная цифра").
Любые данные внутри компьютера это последовательность битов. Так хранятся изображения, музыка и текст. Привычные числа из десятичной системы тоже представимы в двоичном виде:
- 0 →
0 - 1 →
1 - 2 →
10
Как закодировать текст
Компьютер не "понимает" буквы. Чтобы хранить текст, символы превращают в числа. Этим занимаются кодировки. Кодировка это таблица, где каждому символу соответствует определенное число.
Самый прямой способ состоит в том, чтобы пронумеровать буквы, начиная с единицы:
a→1b→2- ...и так до
z→26
Теперь слово 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, поэтому он выводится без дополнительных настроек.
Полезное
Ваше упражнение проверяется по этим тестам
import static org.assertj.core.api.Assertions.assertThat;
import java.io.ByteArrayOutputStream;
import java.io.FileDescriptor;
import java.io.FileOutputStream;
import java.io.PrintStream;
class AppTest {
public static void main(String[] args) {
final var expected = "© 2024 Hexlet";
ByteArrayOutputStream out = new ByteArrayOutputStream();
System.setOut(new PrintStream(out));
App.main(null);
final var actual = out.toString().trim();
System.setOut(new PrintStream(new FileOutputStream(FileDescriptor.out)));
System.out.println(actual);
assertThat(actual).isEqualTo(expected);
}
}Решение учителя откроется через:
20:00
