В 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. Поэтому вы должны полагаться на кодировку символов, используемую для исходного файла.