Предполагая, что вы хотите сохранить этот бизнес кодирования / декодирования (похоже, вы пытаетесь использовать процесс кодирования / декодирования для преобразования между наборами символов?):
На этапе кодирования вы используете mb_detect_encoding
во входной строке и передайте ее в htmlentities
, что позволяет правильно определить знак евро на вашем входе (большую часть времени).
Однако на этапе декодирования вы неукажите любую кодировку, поэтому html_entity_decode
выберет ISO-8859-1, который не включает знак евро.
Если вы хотите оставить этот блок кода в основном таким же, вам нужно выбрать кодировку длядекодирование к этому включает все символы, которые вы хотите (например, UTF-8 или ISO-8859-15).
Редактировать: Вот пример, основанный на вашем коде (я выбрал ISO-8859-15, но вам действительно нужно знать или решить, какой выходной набор символов вы хотите):
$str = "â€êþÿûîœøîô‘ë’ðüïlæ߀¿×÷¡ï";
$str = htmlentities($str, ENT_QUOTES, mb_detect_encoding($str));
$str = html_entity_decode($str, ENT_QUOTES, 'ISO-8859-15');
$f = fopen("test.txt","w");
fputs($f,$str);
fclose($f);