$str = 'Привет 2019 Мир!';
$str = mb_convert_encoding( $str, 'windows-1251', mb_detect_encoding( $str ) );
var_dump( $str );
// >>> string(16) "������ 2019 ���!"
- var_dump( $str );
+ echo bin2hex($str);
Получаем cf f0 e8 e2 e5 f2 20 32 30 31 39 20 cc e8 f0 21
Привет 2019 Мир!
$str = 'Привет 2019 Мир!'; // написано в той кодировке, в которой сохранен файл (хрустальный шар говорит, что utf-8)
$str = mb_convert_encoding( $str, 'windows-1251', mb_detect_encoding( $str ) ); // конвертируем в cp1251
header('Content-Type: text/html; charset=windows-1251'); // Откуда трабла с кодировкой? - не соответствие сообщаемой кодировки в http-заголовке от сервера, с выводимым контентом от сервера. Исправляется явным указанием заголовка
var_dump( $str ); // выводим в той кодировке, что выводит заголовок charset сервера в браузер (хрустальный шар говорит, что до указания header() было charset=utf-8)