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

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

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

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

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

Ответ 1

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

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

if (preg_match('!!u', $string))
{
   // This is UTF-8
}
else
{
   // Definitely not UTF-8
}

Ответ 2

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

Набор символов также может быть доступен в заголовках ответа 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"
}

Ответ 3

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)

Ответ 4

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

Ответ 5

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