/**
* Detect XML encoding, as per XML 1.0 Appendix F.1
*
* @todo Add support for EBCDIC
* @param string $data XML data
* @param SimplePie_Registry $registry Class registry
* @return array Possible encodings
*/
public static function xml_encoding($data, $registry)
{
// UTF-32 Big Endian BOM
if (substr($data, 0, 4) === "��") {
$encoding[] = 'UTF-32BE';
} elseif (substr($data, 0, 4) === "��") {
$encoding[] = 'UTF-32LE';
} elseif (substr($data, 0, 2) === "��") {
$encoding[] = 'UTF-16BE';
} elseif (substr($data, 0, 2) === "��") {
$encoding[] = 'UTF-16LE';
} elseif (substr($data, 0, 3) === "") {
$encoding[] = 'UTF-8';
} elseif (substr($data, 0, 20) === "<?xml") {
if ($pos = strpos($data, "?>")) {
$parser = $registry->create('XML_Declaration_Parser', array(SimplePie_Misc::change_encoding(substr($data, 20, $pos - 20), 'UTF-32BE', 'UTF-8')));
if ($parser->parse()) {
$encoding[] = $parser->encoding;
}
}
$encoding[] = 'UTF-32BE';
} elseif (substr($data, 0, 20) === "<?xml") {
if ($pos = strpos($data, "?>")) {
$parser = $registry->create('XML_Declaration_Parser', array(SimplePie_Misc::change_encoding(substr($data, 20, $pos - 20), 'UTF-32LE', 'UTF-8')));
if ($parser->parse()) {
$encoding[] = $parser->encoding;
}
}
$encoding[] = 'UTF-32LE';
} elseif (substr($data, 0, 10) === "<?xml") {
if ($pos = strpos($data, "?>")) {
$parser = $registry->create('XML_Declaration_Parser', array(SimplePie_Misc::change_encoding(substr($data, 20, $pos - 10), 'UTF-16BE', 'UTF-8')));
if ($parser->parse()) {
$encoding[] = $parser->encoding;
}
}
$encoding[] = 'UTF-16BE';
} elseif (substr($data, 0, 10) === "<?xml") {
if ($pos = strpos($data, "?>")) {
$parser = $registry->create('XML_Declaration_Parser', array(SimplePie_Misc::change_encoding(substr($data, 20, $pos - 10), 'UTF-16LE', 'UTF-8')));
if ($parser->parse()) {
$encoding[] = $parser->encoding;
}
}
$encoding[] = 'UTF-16LE';
} elseif (substr($data, 0, 5) === "<?xml") {
if ($pos = strpos($data, "?>")) {
$parser = $registry->create('XML_Declaration_Parser', array(substr($data, 5, $pos - 5)));
if ($parser->parse()) {
$encoding[] = $parser->encoding;
}
}
$encoding[] = 'UTF-8';
} else {
$encoding[] = 'UTF-8';
}
return $encoding;
}