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

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

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

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

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

Ответы [ 5 ]

53 голосов
/ 10 декабря 2010

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

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

if (preg_match('!!u', $string))
{
   // This is UTF-8
}
else
{
   // Definitely not UTF-8
}
4 голосов
/ 10 декабря 2010

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

Набор символов также может быть доступен в заголовках ответа 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 голосов
/ 13 мая 2015
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)
0 голосов
/ 10 декабря 2010

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

0 голосов
/ 10 декабря 2010

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...