먼저 어떤 인코딩이 사용되었는지 감지해야합니다. RSS 피드를 분석 할 때 (아마 HTTP를 통해) HTTP 헤더 필드 의 charset
매개 변수 에서 인코딩을 읽어야합니다 . 존재하지 않으면 XML 처리 명령 의 속성 에서 인코딩을 읽으십시오 . 그것이 누락 된 경우 사양에 정의 된 UTF-8을 사용하십시오 .Content-Type
encoding
편집 여기 내가 아마 할 것입니다 :
cURL 을 사용 하여 응답을 보내고 가져옵니다. 이를 통해 특정 헤더 필드를 설정하고 응답 헤더를 가져올 수 있습니다. 응답을 가져온 후 HTTP 응답을 구문 분석하고 헤더와 본문으로 분할해야합니다. 그런 다음 Content-Type
헤더에는 MIME 유형과 charset
인코딩 / 문자 세트가 있는 매개 변수가 포함 된 헤더 필드가 포함 되어야합니다 . 그렇지 않은 경우 encoding
특성 이 있는지 XML PI를 분석하고 거기서 인코딩을 가져옵니다. 또한 누락 된 경우 XML 스펙은 UTF-8을 인코딩으로 사용하도록 정의합니다.
$url = 'http://www.lr-online.de/storage/rss/rss/sport.xml';
$accept = array(
'type' => array('application/rss+xml', 'application/xml', 'application/rdf+xml', 'text/xml'),
'charset' => array_diff(mb_list_encodings(), array('pass', 'auto', 'wchar', 'byte2be', 'byte2le', 'byte4be', 'byte4le', 'BASE64', 'UUENCODE', 'HTML-ENTITIES', 'Quoted-Printable', '7bit', '8bit'))
);
$header = array(
'Accept: '.implode(', ', $accept['type']),
'Accept-Charset: '.implode(', ', $accept['charset']),
);
$encoding = null;
$curl = curl_init($url);
curl_setopt($curl, CURLOPT_RETURNTRANSFER, true);
curl_setopt($curl, CURLOPT_HEADER, true);
curl_setopt($curl, CURLOPT_HTTPHEADER, $header);
$response = curl_exec($curl);
if (!$response) {
// error fetching the response
} else {
$offset = strpos($response, "\r\n\r\n");
$header = substr($response, 0, $offset);
if (!$header || !preg_match('/^Content-Type:\s+([^;]+)(?:;\s*charset=(.*))?/im', $header, $match)) {
// error parsing the response
} else {
if (!in_array(strtolower($match[1]), array_map('strtolower', $accept['type']))) {
// type not accepted
}
$encoding = trim($match[2], '"\'');
}
if (!$encoding) {
$body = substr($response, $offset + 4);
if (preg_match('/^<\?xml\s+version=(?:"[^"]*"|\'[^\']*\')\s+encoding=("[^"]*"|\'[^\']*\')/s', $body, $match)) {
$encoding = trim($match[1], '"\'');
}
}
if (!$encoding) {
$encoding = 'utf-8';
} else {
if (!in_array($encoding, array_map('strtolower', $accept['charset']))) {
// encoding not accepted
}
if ($encoding != 'utf-8') {
$body = mb_convert_encoding($body, 'utf-8', $encoding);
}
}
$simpleXML = simplexml_load_string($body, null, LIBXML_NOERROR);
if (!$simpleXML) {
// parse error
} else {
echo $simpleXML->asXML();
}
}