У меня есть фид, взятый с сторонних сайтов, и иногда мне приходится применять 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()
.