你首先需要检测所使用的编码方式。由于你可能是通过HTTP解析RSS源,因此应该从
Content-Type
HTTP header field的
charset
参数中读取编码方式。如果没有出现该参数,则应从
XML processing instruction的
encoding
属性中读取编码方式。如果那也不存在,则应
按照规范使用UTF-8编码。
这是我可能会做的:
我会使用cURL发送和获取响应。这样可以设置特定的头字段并获取响应头。在获取响应后,您需要解析HTTP响应并将其拆分为头和正文。头应该包含Content-Type
头字段,其中包含MIME类型和(希望)编码/字符集的charset
参数。如果没有,则我们将分析XML PI以检查encoding
属性是否存在,并从中获取编码。如果也缺失了,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) {
} 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)) {
} else {
if (!in_array(strtolower($match[1]), array_map('strtolower', $accept['type']))) {
}
$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']))) {
}
if ($encoding != 'utf-8') {
$body = mb_convert_encoding($body, 'utf-8', $encoding);
}
}
$simpleXML = simplexml_load_string($body, null, LIBXML_NOERROR);
if (!$simpleXML) {
} else {
echo $simpleXML->asXML();
}
}