Взять, к примеру, PHP.В PHP нет родного понимания кодировок (здесь есть несколько звездочек и сносок, но, скажем, нет).Он ищет определенные конкретные байты в исходном коде, которые что-то для него значат, и в основном просто проходит через все остальное, не имеющее для него особого значения.Например:
$foo = "bar $baz 42";
Это запускает интерполяцию строки;PHP попытается вставить переменную $baz
в эту строку.Это делается путем поиска байта 0x24
(ASCII "$") и следующего байта "не слова" в строке, что приводит к поиску имени переменной $baz
внутри строки.Что-нибудь еще в строке, через которую он просто проходит, как есть.
Вы можете сделать это на PHP:
echo "意味分からない";
Все, что PHP видит здесь, это некоторый двоичный двоичный объект, который не представляет для него особого интереса.,Он не поддерживает и не понимает этих персонажей, но и не пытается ничего с ними поделать.Он просто пропускает двоичные данные как есть и, таким образом, выдает желаемое японское предложение.
Теперь, если бы мы написали это предложение в некоторой не ASCII-безопасной кодировке, такой как, скажем, ISO-2022-JP-3, это будет:
1b24 4230 554c 234a 2c24 2b24 6924 4a24 241b 2842
Вы заметите там 24
байт.Если бы вы могли создать действительный файл PHP, который содержал эти байты между двойными кавычками, PHP попытался бы интерпретировать эти 0x24
байты как $
и попытался бы интерполировать там переменные.
$ cat /tmp/foo.php
<?php echo "B0UL#J,$+$i$J$$";
$ xxd /tmp/foo.php
00000000: 3c3f 7068 7020 6563 686f 2022 1b24 4230 <?php echo ".$B0
00000010: 554c 234a 2c24 2b24 6924 4a24 241b 2842 UL#J,$+$i$J$$.(B
00000020: 223b 0a ";.
$ php /tmp/foo.php
PHP Notice: Undefined variable: B0UL in /tmp/foo.php on line 1
PHP Notice: Undefined variable: i in /tmp/foo.php on line 1
PHP Notice: Undefined variable: J in /tmp/foo.php on line 1
Это один пример ситуации, когда важна совместимость UTF-8 с ASCII.