18. juni 2007 - 12:07Der er
27 kommentarer og 2 løsninger
Problem med XML og danske specialtegn
Jeg har en XML-fil som indeholder æøå og har encoding = UTF-8. Jeg har så lavet en utf8_encode inden det bliver sendt til parseren, men så opdeler den af en eller anden grund teksten i taggene op i en del før æ/ø/å og en del med æ/ø/å og resten af teksten..
Der er en XML-Fil som bliver sendt fra et SOAP-interface (mener jeg det er). Den fil bliver sendt til klienten som skriver den i et hidden felt i en form som så bliver submittet.
Det jeg så får fra $_POST[] laver jeg en utf8_encode på, fordi der er æ/ø/å i teksten efter den bliver submittet (muligvis før, men det er jeg ikke helt sikker på)
Parseren ligger data i et array som så skrives til noget javascript som skal vise det på en webside.. websiden er ISO-8859-1, men problemet må vel ligge i PHP'en siden det er parseren der deler teksten op i flere dele, eller tager jeg fejl her?
Du må ikke begynde at blande tegnsæt ... så går der ged i den. Bruger du utf-8, skal det være over hele linjen: DB, serverkode, Content-type når dokumentet sendes fra serveren og meta-elementet i dokumentet.
Ok nu er det hele lavet om til UTF-8, men det har ikke gjort nogen umiddelbar forskel.. Jeg skal stadig køre en utf8_encode for at få de rigtige tegn og den deler stadig teksten op. Andre forslag?
Det er ikke mig der genererer XML'en, det er noget vi modtager fra eSYN..
Selve funktionen der bruges til parseren er den her: function XMLLibParseLookup ($data, &$result) { global $errorMessage, $itemCount, $arItems, $glItem;
/* Set esyn up/down status */ if ($data == '') $_SESSION["fstyr_status"] = "DOWN"; else $_SESSION["fstyr_status"] = "UP";
if (!xml_parse($xml_parser, $formattet_data)) { die(sprintf("XML error: %s at line %d", xml_error_string(xml_get_error_code($xml_parser)), xml_get_current_line_number($xml_parser))); } xml_parser_free($xml_parser); /* $result = $arItems; */
global $arItems; $result = $arItems;
return($errorMessage); }
Igen ikke noget jeg har lavet..
Det er så vidt jeg kan se ikke simpleXML der bruges og jeg laver den utf8_encode på hele xml-strengen, men det kan godt være at jeg skal prøve at lave en decode som horsmark foreslår...
OK, det nærmeste jeg kan komme på en kildekode i øjeblikket er det her: "PRIVAT PERSONKØRSEL" der skulle stå "PRIVAT PERSONKØRSEL" når den skriver det ud, men i stedet for deler den det i 2 tekststrenge og kun den sidste del bliver vidst og det ved jeg fordi den skriver det her rigtigt nok: ØVELSESKØRSEL -> ØVELSESKØRSEL
kan du ikke smide et eksempel hvor du henter noget xml ud ? (det er dér du skal decode) Derudover kan jeg varmt anbefale at du bruger simplexml istedet for - det er sq ligetil :-)
Det er det sikkert, men der skal helst laves så få ændringer i koden som overhovedet muligt, selvom jeg nok bliver nødt til at slå i bordet så vi kan komme væk fra den tidlige middelalder koden antyder vi lever i her...
Jeg er ikke helt med på hvad du mener med at hente noget xml ud.. er det der hvor jeg henter data ud af xml-teksten eller er det hvor jeg tager xml'en og smider den ned til parseren du vil have?
Jeg kommer pludselig i tanker om, at PHP's default-tegnsæt jo (besynderligt nok) er iso-8859-1. Mon ikke det er dér, kæden hopper af? Prøv at køre en phpinfo og søg i browseren på ordet 'charset' ;o)
hmm der er en default_charset under PHP Core, men den er ikke sat.. Desuden så er der blevet gennemtvunget, mod min vilje, at der skal bruges ISO-8859-1 som tegnsæt, så der kan ikke ændres på den alligevel.
horsmark-> Stadig ikke helt med på hvad du ønsker.. Jeg kan godt give dig den funktion der henter data ud af xml'en hvis det er den du vil have, men jeg kan ikke rigtig se hvordan det kan hjælpe.
Hvis vi lige kan opsummere: Jeg får et xml-dokument hentet ind i browseren, den indeholder æ/ø/å, men vi kan ikke lokalisere hvorfor.. xml bliver skrevet i et <input type="hidden">-felt vha. javascript formen med feltet bliver derefter submittet xml sendes til PHP som skal parse data parseren brokker sig over at der er æ/ø/å i teksten (meget forståeligt, faktisk)
Jeg har derfor prøvet at lave en utf8_encode på hele xml'en lige inden den bliver sendt til parseren og nu brokker den sig ikke længere (igen, meget forståeligt) Problemet med den metode er at teksten bliver delt op ved det første æ/ø/å som bliver fundet..
Hvis jeg prøver med en utf8_decode så skriver den PERSONK?SEL i stedet for PERSONKØRSEL og det holder heller ikke..
function LookupData($parser, $data) { global $curTag; // get the Channel information first global $errorMessage, $arItems, $itemCount, $suppCount, $glItem, $testidx; $prefix = "^FSTYR:VEHICLEREQUEST^FSTYR:VEHICLECOLLECTION^FSTYR:VEHICLESTRUCTURE^FSTYR:VEHICLEINFORMATION^FSTYR:"; $sup_prefix = "^FSTYR:VEHICLEREQUEST^FSTYR:VEHICLECOLLECTION^FSTYR:VEHICLESTRUCTURE^FSTYR:VEHICLESUPPLEMENTALINFORMATIONCOLLECTION^FSTYR:VEHICLESUPPLEMENTALINFORMATION^FSTYR:";
Der er en hel del mere end det, men det ville fylde en hel del og ville ikke hjælpe fordi det ser ens ud hele vejen ned..
$data er blevet kørt gennem utf8_encode inden det bliver sendt til den her funktion, ellers brokker parseren sig og parseren er lavet således: $xml_parser = xml_parser_create('ISO-8859-1');
Hvis jeg fjerner ISO-8859-1 så skriver den godt nok "ØRSEL" men der mangler jo så stadig "PERSONK"
nåh, vi løste det ved at skifte æ/ø/å ud med en tekststreng lige inden parseren og skifte tekststregen ud med æ/ø/å i funktionen som parseren kalder.. den der er et udsnit af her: 20/06-2007 12:46:00
Hvis der bliver lagt nogle svar får i point for indsatsen.. point delt i 3?
svar :-) ...omend i har løst problemet med et hack og ingen af os herinde kunne finde en måde så husk at smide den største ortion point til jerselv :-)
Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.