PHP: Кодировка
На самом базовом уровне компьютер работает только с нулями и единицами, что составляет так называемый двоичный код. Каждую единицу или ноль называют битом (от binary digit, «двоичная цифра»).
Любые данные в компьютере представлены просто как последовательность битов, например изображения, музыка и текст. Привычные нам числа из десятичной системы тоже можно представить в двоичной форме.
- 0 →
0 - 1 →
1 - 2 →
10
Как закодировать текст?
Компьютер не «понимает» текст. Чтобы работать с буквами и другими символами, их тоже нужно превратить в числа. Это делают с помощью кодировок, то есть таблиц, в которых каждому символу соответствует определенное число.
Самый простой способ состоит в том, чтобы пронумеровать буквы, начиная с 1.
a→1b→2- ...и так до
z→26
Теперь мы можем представить слово hello как набор чисел.
h e l l o
↓ ↓ ↓ ↓ ↓
8 5 12 12 15А good превращается в такую последовательность.
g o o d
↓ ↓ ↓ ↓
7 15 15 4Программа не знает, что это слово. Она просто видит инструкцию «нужно отобразить символ с кодом 8, потом с кодом 5 и т. д.».
ASCII. Первая массовая кодировка
Первые компьютеры работали в основном с английским языком. Для него в 1960-х годах придумали таблицу ASCII, включавшую 128 символов, в том числе латинский алфавит, цифры, знаки препинания, спецсимволы (@, #, !, \n) и управляющие коды.
Этого хватало для первых программ, но не для всего мира.
Когда компьютеры начали использовать в других странах, возникла проблема. В ASCII нет кириллицы, иероглифов, арабского письма, ударений, валютных символов и т. д.
Каждая страна или компания начала делать свою кодировку на основе ASCII.
- Windows придумала Windows-1251 для русского
- Apple создала Mac Roman
- Страны Восточной Европы, Азии и Ближнего Востока разработали свои варианты
Все эти кодировки были несовместимы между собой. Код 226 в одной кодировке мог быть буквой é, в другой буквой и, в третьей вообще техническим символом. Это приводило к настоящему хаосу.
Как выглядели проблемы с кодировками
Если вы видите в тексте вот это.
ÐÑивеÑ!Это означает, что программа неправильно определила кодировку текста. Она получила последовательность байтов, но прочитала их не той таблицей.
Это было нормой в 1990-х и 2000-х. Одна программа писала текст в Windows-1251, другая читала его как ISO-8859-1, и в результате получался мусор.
Unicode и UTF-8. Конец бардака
Чтобы все починить, в 1990-х начали создавать универсальную таблицу Unicode, которая содержит символы всех письменных систем мира, в том числе латинский алфавит и кириллицу, китайское и арабское письмо, математические знаки, древнеегипетское письмо и даже эмодзи.
Внутри Unicode есть несколько форматов хранения. Наиболее распространенным из них является UTF-8. Он компактно кодирует английские символы, но может расширяться под любые другие.
Сегодня UTF-8 является стандартом по умолчанию в интернете, Linux, базах данных и редакторах кода. Исходный код PHP и строки в современных проектах тоже принято хранить в UTF-8.
Зачем это знать программисту?
- Вы будете работать с текстом, и ошибки кодировки по-прежнему случаются, особенно при чтении файлов, обработке данных, взаимодействии с API и базами данных.
- PHP хранит строку как последовательность байтов, поэтому при работе с файлами и базами данных кодировку иногда приходится указывать явно.
- Нужно уметь диагностировать проблемы. Например, если видите «кракозябры», это почти наверняка ошибка кодировки.
Задание
Программа получает числовые коды символов и выводит их на экран — это удобно, когда символ сложно набрать с клавиатуры. Найдите символы с кодами 126, 94 и 37 в таблице ASCII (нас интересует десятичный код — dec или decimal) и выведите каждый на отдельной строке с помощью функции chr() и перевода строки:
print_r(chr(...) . "\n");
print_r(chr(...) . "\n");
print_r(chr(...) . "\n");Например, символ ? имеет код 63:
print_r(chr(63)); // вывод: ?Полезное
PHP: Кодировка
На самом базовом уровне компьютер работает только с нулями и единицами, что составляет так называемый двоичный код. Каждую единицу или ноль называют битом (от binary digit, «двоичная цифра»).
Любые данные в компьютере представлены просто как последовательность битов, например изображения, музыка и текст. Привычные нам числа из десятичной системы тоже можно представить в двоичной форме.
- 0 →
0 - 1 →
1 - 2 →
10
Как закодировать текст?
Компьютер не «понимает» текст. Чтобы работать с буквами и другими символами, их тоже нужно превратить в числа. Это делают с помощью кодировок, то есть таблиц, в которых каждому символу соответствует определенное число.
Самый простой способ состоит в том, чтобы пронумеровать буквы, начиная с 1.
a→1b→2- ...и так до
z→26
Теперь мы можем представить слово hello как набор чисел.
h e l l o
↓ ↓ ↓ ↓ ↓
8 5 12 12 15А good превращается в такую последовательность.
g o o d
↓ ↓ ↓ ↓
7 15 15 4Программа не знает, что это слово. Она просто видит инструкцию «нужно отобразить символ с кодом 8, потом с кодом 5 и т. д.».
ASCII. Первая массовая кодировка
Первые компьютеры работали в основном с английским языком. Для него в 1960-х годах придумали таблицу ASCII, включавшую 128 символов, в том числе латинский алфавит, цифры, знаки препинания, спецсимволы (@, #, !, \n) и управляющие коды.
Этого хватало для первых программ, но не для всего мира.
Когда компьютеры начали использовать в других странах, возникла проблема. В ASCII нет кириллицы, иероглифов, арабского письма, ударений, валютных символов и т. д.
Каждая страна или компания начала делать свою кодировку на основе ASCII.
- Windows придумала Windows-1251 для русского
- Apple создала Mac Roman
- Страны Восточной Европы, Азии и Ближнего Востока разработали свои варианты
Все эти кодировки были несовместимы между собой. Код 226 в одной кодировке мог быть буквой é, в другой буквой и, в третьей вообще техническим символом. Это приводило к настоящему хаосу.
Как выглядели проблемы с кодировками
Если вы видите в тексте вот это.
ÐÑивеÑ!Это означает, что программа неправильно определила кодировку текста. Она получила последовательность байтов, но прочитала их не той таблицей.
Это было нормой в 1990-х и 2000-х. Одна программа писала текст в Windows-1251, другая читала его как ISO-8859-1, и в результате получался мусор.
Unicode и UTF-8. Конец бардака
Чтобы все починить, в 1990-х начали создавать универсальную таблицу Unicode, которая содержит символы всех письменных систем мира, в том числе латинский алфавит и кириллицу, китайское и арабское письмо, математические знаки, древнеегипетское письмо и даже эмодзи.
Внутри Unicode есть несколько форматов хранения. Наиболее распространенным из них является UTF-8. Он компактно кодирует английские символы, но может расширяться под любые другие.
Сегодня UTF-8 является стандартом по умолчанию в интернете, Linux, базах данных и редакторах кода. Исходный код PHP и строки в современных проектах тоже принято хранить в UTF-8.
Зачем это знать программисту?
- Вы будете работать с текстом, и ошибки кодировки по-прежнему случаются, особенно при чтении файлов, обработке данных, взаимодействии с API и базами данных.
- PHP хранит строку как последовательность байтов, поэтому при работе с файлами и базами данных кодировку иногда приходится указывать явно.
- Нужно уметь диагностировать проблемы. Например, если видите «кракозябры», это почти наверняка ошибка кодировки.
Задание
Программа получает числовые коды символов и выводит их на экран — это удобно, когда символ сложно набрать с клавиатуры. Найдите символы с кодами 126, 94 и 37 в таблице ASCII (нас интересует десятичный код — dec или decimal) и выведите каждый на отдельной строке с помощью функции chr() и перевода строки:
print_r(chr(...) . "\n");
print_r(chr(...) . "\n");
print_r(chr(...) . "\n");Например, символ ? имеет код 63:
print_r(chr(63)); // вывод: ?Полезное
Ваше упражнение проверяется по этим тестам
<?php
namespace HexletBasics\Strings\Encoding;
use HexletBasics\Exercise\TestCase;
class SolutionTest extends TestCase
{
public function test()
{
$expected = "~\n^\n%\n";
$this->assertOutput($expected);
}
}Решение учителя откроется через:
20:00
