magpie: only force convert encoding if initial parsing failed

This commit is contained in:
Andrew Dolgov 2007-08-13 04:31:57 +01:00
parent 3a486dec89
commit feb3185124
2 changed files with 27 additions and 1 deletions

View File

@ -313,7 +313,7 @@ function _convert_entities ($string) {
Output: parsed RSS object (see rss_parse) Output: parsed RSS object (see rss_parse)
\*=======================================================================*/ \*=======================================================================*/
function _response_to_rss ($resp) { function _response_to_rss ($resp) {
$converted_source = _convert_entities(mb_convert_encoding($resp->results, "UTF-8", mb_detect_encoding($resp->results))); $converted_source = _convert_entities($resp->results);
$rss = new MagpieRSS( $converted_source, MAGPIE_OUTPUT_ENCODING, "UTF-8", false); $rss = new MagpieRSS( $converted_source, MAGPIE_OUTPUT_ENCODING, "UTF-8", false);
// if RSS parsed successfully // if RSS parsed successfully

View File

@ -132,7 +132,33 @@ class MagpieRSS {
xml_set_character_data_handler( $this->parser, 'feed_cdata' ); xml_set_character_data_handler( $this->parser, 'feed_cdata' );
$status = xml_parse( $this->parser, $source ); $status = xml_parse( $this->parser, $source );
# try to force convert everything to UTF-8 and parse again
# to salvage at least some data from the feed
if (! $status) {
$errorcode = xml_get_error_code( $this->parser );
if ( $errorcode != XML_ERROR_NONE ) {
xml_parser_free( $this->parser );
list($parser, $source) = $this->create_parser($source,
$output_encoding, $input_encoding, $detect_encoding);
$source = mb_convert_encoding($source, "UTF-8",
mb_detect_encoding($source));
$this->parser = $parser;
xml_set_object( $this->parser, $this );
xml_set_element_handler($this->parser,
'feed_start_element', 'feed_end_element' );
xml_set_character_data_handler( $this->parser, 'feed_cdata' );
$status = xml_parse( $this->parser, $source);
}
}
if (! $status ) { if (! $status ) {
$errorcode = xml_get_error_code( $this->parser ); $errorcode = xml_get_error_code( $this->parser );
if ( $errorcode != XML_ERROR_NONE ) { if ( $errorcode != XML_ERROR_NONE ) {