Chyba kodování při parsování XML
- Scorpio
- Člen | 45
Zdravím,
mám dotaz, netýká se tak úplně nette. Mám v Nette 2.2.3 napsanou
aplikaci kde používám parser XML. Vypadá nějak takto:
try {
$dom = new \DOMDocument("1.0", "UTF-8");
$dom->strictErrorChecking = false;
$dom->validateOnParse = false;
$dom->recover = true;
$dom->loadXML(file_get_contents($file));
$xml = simplexml_import_dom($dom);
if ($xml === false) {
foreach (libxml_get_errors() as $error) {
$text[] = $error->message;
}
\Tracy\Debugger::log("libXML: " . implode(", ", $text), 'error');
} else {
if ($subparam === false) {
$this->xml[$type] = $xml;
} else {
$this->xml[$type][$subparam] = $xml;
}
@unlink($file);
}
} catch (Exception $e) {
\Tracy\Debugger::log("Exception: " . $e->getMessage(), 'error');
}
Funguje parádně a i když je tam jednoduchá chyba dokáže ji vynechat.
Avšak jeden z mých dodavatelů má XML v kódování Windows-1250 a čas od
času tam zanese znak vchybném kodování (jak to opravdu nevím ale
pravděpodobně vůbec nemaj ošetřený vstupy). Můj parser sice dokáže
takový XML zpracovat ale jakmile dojde k chybě tak nepokračuje dál. Takže
místo 10000 položek načte třeba 100 protože ve 100 je chyba.
Když spustím XML ve firefoxu tak ten ho nezobrazí a napíše, že tam je
neplatný znak. Např:
NVIDIA Super Resolution technology
Takže má otázka zní je nějak možné odstranit neplatné znaky
v kódování 1250 před tím než ho pošlu do XML čtečky? Pokud použiju
Strings::fixEncoding() tak mi to zase veškerou diakritiku změní na ?.
Neřešil jste někdo už takový problém?