Как определить, нужно ли применять utf8 декодировать или кодировать строку?

У меня есть фид, взятый с сторонних сайтов, и иногда мне приходится применять utf8_decode и другие времена utf8_encode для получения нужного видимого результата.

Если по ошибке один и тот же материал применяется дважды / или используется неправильный метод, я получаю что-то более уродливое, это то, что я хочу изменить.

Как я могу определить, когда нужно применить строку?

ОБНОВИТЬ

На самом деле содержимое возвращает UTF-8, но внутри есть части, которые нет.

Я не могу сказать, что могу полагаться на mb_detect_encoding() . Некоторое причудливое ложное срабатывание некоторое время назад.

Самый универсальный способ, который я нашел хорошо работать в каждом случае:

 if (preg_match('!!u', $string)) { // this is utf-8 } else { // definitely not utf-8 } 

Вы можете использовать

  • mb_detect_encoding – определение кодировки символов

Кодировка также может быть доступна в заголовках HTTP-ответов или в самих ответах.

Пример:

 var_dump( mb_detect_encoding( file_get_contents('http://stackoverflow.com/questions/4407854') ), $http_response_header ); 

Выход ( кодовый код ):

 string(5) "UTF-8" array(9) { [0]=> string(15) "HTTP/1.1 200 OK" [1]=> string(33) "Cache-Control: public, max-age=11" [2]=> string(38) "Content-Type: text/html; charset=utf-8" [3]=> string(38) "Expires: Fri, 10 Dec 2010 10:40:07 GMT" [4]=> string(44) "Last-Modified: Fri, 10 Dec 2010 10:39:07 GMT" [5]=> string(7) "Vary: *" [6]=> string(35) "Date: Fri, 10 Dec 2010 10:39:55 GMT" [7]=> string(17) "Connection: close" [8]=> string(21) "Content-Length: 34119" } 
 function str_to_utf8 ($str) { $decoded = utf8_decode($str); if (mb_detect_encoding($decoded , 'UTF-8', true) === false) return $str; return $decoded; } var_dump(str_to_utf8("« Chrétiens d'Orient » : la RATP fait marche arrière")); //string '« Chrétiens d'Orient » : la RATP fait marche arrière' (length=56) var_dump(str_to_utf8("« Chrétiens d'Orient » : la RATP fait marche arrière")); //string '« Chrétiens d'Orient » : la RATP fait marche arrière' (length=56) 

В фиде (я предполагаю, что вы имеете в виду какой-то фид на основе XML) должен иметь атрибут в заголовке, сообщающий вам, что такое кодировка. Если нет, вам не повезло, поскольку у вас нет надежного средства идентификации кодировки.

Автоопределение кодирования не является пуленепробиваемым, но вы можете попробовать mb_detect_encoding() . См. Также mb_check_encoding() .