Come caricare XML quando il PHP non può indicare la giusta codifica?

Sto cercando di caricare un XML di origine da una posizione remota, quindi non ho il controllo della formattazione. Purtroppo il file XML sto cercando di caricare è alcuna codifica:

<ROOT xmlns:sql="urn:schemas-microsoft-com:xml-sql"> <NODE> </NODE> </ROOT>

Quando si cerca qualcosa di simile:

$doc = new DOMDocument( );
$doc->load(URI);

Ho fatto io:

Input is not proper UTF-8, indicate encoding ! Bytes: 0xA3 0x38 0x2C 0x38

Ive ha guardato modi per sopprimere questo, ma senza fortuna. Come devo caricare questo in modo che io possa usare con DOMDocument?

InformationsquelleAutor | 2009-08-30

 

4 Replies
  1. 1

    Si potrebbe modificare il documento (“pre-processo”) per specificare la codifica viene consegnato in aggiunta una dichiarazione XML. Cos’è, si dovrà accertare se stessi, naturalmente. Oggetto DOM, dovrebbe, quindi, di analizzare.

    Esempio dichiarazione XML:

    <?xml version="1.0" encoding="UTF-8" ?>
    • Byte lamentato per indicare che la sua ISO-8859-1, non UTF-8. In particolare, 0xA3 è un simbolo di valuta GBP (cancelletto).
    • Ovviamente non era UTF-8, o questo non sarebbe stato un problema. Mi riferisco alla fatidica parola “esempio”. Cordiali saluti. Quei codici non automaticamente dedurre ISO-8859-1.
  2. 1

    Hai per convertire il documento in formato UTF-8, il modo più semplice sarebbe quella di utilizzare utf8_encode().

    DOMdocument esempio:

    $doc = new DOMDocument();
    $content = utf8_encode(file_get_contents($url));
    $doc->loadXML($content);

    SimpleXML esempio:

    $xmlInput = simplexml_load_string(utf8_encode(file_get_contents($url_or_file)));

    Se non si conosce la codifica corrente, utilizzare mb_detect_encoding(), per esempio:

    $content = utf8_encode(file_get_contents($url_or_file));
    $encoding = mb_detect_encoding($content);
    $doc = new DOMdocument();
    $res = $doc->loadXML("<?xml encoding='$encoding'>" . $content);

    Note:

    • Se la codifica non può essere rilevato (funzione restituisce FALSE), si può provare a forzare la codifica via utf8_encode().
    • Se si sta caricando il codice html tramite $doc->loadHTML invece, è ancora possibile utilizzare intestazione XML.

    Se si conosce la codifica, l’uso iconv() per convertirlo:

    $xml = iconv('ISO-8859-1' ,'UTF-8', $xmlInput)
  3. 0

    Si può provare a utilizzare il XMLReader classe. XMLReader è progettato specificamente per XML e dispone di opzioni per la codifica da utilizzare (tra cui ‘null’ per nessuno).

  4. -1

    Mi sono imbattuto in una situazione simile. Mi è stato sempre un file XML, che doveva essere codificati in UTF-8, ma comprendeva anche alcune cattive ISO caratteri.

    Ho scritto il seguente codice per codificare i cattivi caratteri UTF-8

    <?php
    
    # The XML file with bad characters
    $filename = "sample_xml_file.xml";
    
    # Read file contents to a variable
    $contents = file_get_contents($filename);
    
    # Find the bad characters
    preg_match_all('/[^(\x20-\x7F)]*/', $contents, $badchars);
    
    # Process bad characters if some were found
    if(isset($badchars[0]))
    {
            # Narrow down the results to uniques only
            $badchars[0] = array_unique($badchars[0]);
    
            # Replace the bad characters with their UTF8 equivalents
            foreach($badchars[0] as $badchar)
            {
                    $contents = preg_replace("/".$badchar."/", utf8_encode($badchar), $contents);
            }
    }
    
    # Write the fixed contents back to the file
    file_put_contents($filename, $contents);
    
    # Cleanup
    unset($contents);
    
    # Now the bad characters have been encoded to UTF8
    # It will now load file with DOMDocument
    $dom = new DOMDocument();
    $dom->load($filename);
    
    ?>

    Ho postato la soluzione più in dettaglio:
    http://dev.strategystar.net/2012/01/convert-bad-characters-to-utf-8-in-an-xml-file-with-php/

Lascia un commento