Что такое набор символов, если default_charset пуст

В PHP 5.6 и далее строка default_charset устанавливается в "UTF-8" как описано, например, в документации php.ini . Он говорит, что строка пуста для более ранних версий.

Поскольку я создаю библиотеку Java для связи с PHP, мне нужно знать, какие значения я должен ожидать, когда строка обрабатывается как внутренние байты. Что произойдет, если строка default_charset пуста и строка (буквальная) содержит символы вне диапазона ASCII? Должен ли я ожидать кодировку символов по умолчанию для платформы или кодировку символов, используемую для исходного файла?

Solutions Collecting From Web of "Что такое набор символов, если default_charset пуст"

Короткий ответ

Для литеральных строк – всегда кодировка исходного файла. Значение 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 если кодировка явно не указана.

Тем не менее разработчик несет ответственность за то, чтобы текст в строке был фактически закодирован в кодировке, которая была указана.


Ссылки:

  • Подробная информация о строковом типе
    Подробнее о природе строк PHP (не упоминается default_charset на момент написания).
  • Новые возможности PHP 5.6: кодировка по умолчанию
    Краткое введение новой опции default_charset в примечаниях к выпуску PHP 5.6.
  • Устаревшие функции в PHP 5.6: настройки кодировки iconv и mbstring
    Список устаревших опций php.ini в пользу опции default_chaset .

Кажется, вы не должны полагаться на внутреннюю кодировку. Кодирование внутреннего символа можно увидеть / установить с помощью mb_internal_encoding .

Пример phpinfo ()

  • Версия PHP 5.5.9-1ubuntu4.5
  • default_charset no value

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