Внутренняя кодировка PHP

В соответствии с bin2hex мой PHP внутренне использует UTF-8:

echo bin2hex("ö"); -> c3b6 (utf-8)
echo bin2hex(utf8_decode("ö")); -> f6 (ISO-8859)

Но и mb_internal_encoding() и iconv_get_encoding() говорят, что это ISO-8859-1.

echo mb_internal_encoding(); -> ISO-8859-1
var_dump(iconv_get_encoding()); ->  ["input_encoding"]=>  string(10) "ISO-8859-1"  ["output_encoding"]=>  string(10) "ISO-8859-1"  ["internal_encoding"]=>  string(10) "ISO-8859-1"

UTF-8, похоже, по-видимому, тот, который он использует, но почему он покажет ISO-8859-1?

Ответ 1

Это не странно. Ваша первая проверка - это то, что находится между кавычками. Я предполагаю, что вы сохранили файл, используя UTF-8, что означает, что у вас есть два байта в вашей строке. Это не означает, что внутренняя кодировка - это UTF-8, просто у вас есть эти два байта в вашей строке.

Ответ 2

Это значение по умолчанию в php.ini:

[iconv]
;iconv.input_encoding = ISO-8859-1
;iconv.internal_encoding = ISO-8859-1
;iconv.output_encoding = ISO-8859-1

Если вы хотите использовать UTF-8 везде, вы должны использовать следующие настройки:

default_charset = "UTF-8"

[iconv]
iconv.input_encoding = UTF-8
iconv.internal_encoding = UTF-8
iconv.output_encoding = UTF-8

[mbstring]
mbstring.language = Neutral
mbstring.internal_encoding = UTF-8
mbstring.http_input = auto
mbstring.http_output = UTF-8
mbstring.encoding_translation = On
mbstring.detect_order = auto
mbstring.substitute_character = none;