Как я могу определить, нужно ли применять 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()
.