В PHP 5.6 и далее строка default_charset устанавливается в "UTF-8" как описано, например, в документации php.ini . Он говорит, что строка пуста для более ранних версий.
Поскольку я создаю библиотеку Java для связи с PHP, мне нужно знать, какие значения я должен ожидать, когда строка обрабатывается как внутренние байты. Что произойдет, если строка default_charset пуста и строка (буквальная) содержит символы вне диапазона ASCII? Должен ли я ожидать кодировку символов по умолчанию для платформы или кодировку символов, используемую для исходного файла?
Для литеральных строк – всегда кодировка исходного файла. Значение default_charset здесь ничего не делает.
Строки PHP являются «двоичными», то есть они не имеют внутренней кодировки строк. В основном строка в PHP – это просто буферы байтов.
Для литеральных строк, например $s = "Ä" это означает, что строка будет содержать любые байты, сохраненные в файле между кавычками. Если файл был сохранен в UTF-8, это будет эквивалентно $s = "\xc3\x84" , если файл был сохранен в ISO-8859-1 (latin1), это будет эквивалентно $s = "\xc4" .
Значение default_charset никак не влияет на байты, хранящиеся в строках.
default_charset ? Некоторые функции, которые должны иметь дело со строками в виде текста и знать кодировку, принимают $encoding как аргумент (обычно необязательный). Это говорит о функции, которую кодирует текст в строке.
До того, как значение PHP 5.6 по умолчанию для этих необязательных аргументов $encoding было либо в определении функции (например, htmlspecialchars() ), либо настраивается в разных настройках php.ini для каждого расширения отдельно (например, mbstring.internal_encoding , iconv.input_encoding ).
В PHP 5.6 был введен новый параметр php.ini default_charset . Старые настройки были устаревшими, и все функции, которые принимают необязательный аргумент $encoding теперь должны по умолчанию использовать значение default_charset если кодировка явно не указана.
Тем не менее разработчик несет ответственность за то, чтобы текст в строке был фактически закодирован в кодировке, которая была указана.
Ссылки:
default_charset на момент написания). default_charset в примечаниях к выпуску PHP 5.6. default_chaset . Кажется, вы не должны полагаться на внутреннюю кодировку. Кодирование внутреннего символа можно увидеть / установить с помощью mb_internal_encoding .
Пример phpinfo ()
file1.php
<?php $string = "e"; echo mb_internal_encoding(); //ISO-8859-1
file2.php
<?php $string = "É"; echo mb_internal_encoding(); //ISO-8859-1
оба файла выдадут ISO-8859-1, если вы не измените внутреннюю кодировку вручную.
<?php echo bin2hex("ö"); //c3b6 (utf-8)
Получение шестнадцатеричного символа этого символа возвращает кодировку UTF-8. Если вы сохраните файл с использованием UTF-8, строка в этом примере будет содержать 2 байта, даже если внутренняя кодировка не установлена на UTF-8. Поэтому вы должны полагаться на кодировку символов, используемую для исходного файла.