Avatar billede sw_red_6 Nybegynder
18. juni 2007 - 12:07 Der 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..

Kan der gøres noget ved det?
Avatar billede olebole Juniormester
18. juni 2007 - 12:21 #1
<ole>

Det er ikke til at sige, når man ikke ved, hvad du gør. Hvad er det, du bruger utf8_encode på? Er det overhovedet noget, der skal enkodes?

/mvh
</bole>
Avatar billede olebole Juniormester
18. juni 2007 - 12:23 #2
... og hvad bruger du det til efter parseren? Viser du det på en webside? Hvis du gør det, hvilket tegnsæt serves så den med?
Avatar billede sw_red_6 Nybegynder
18. juni 2007 - 12:38 #3
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?
Avatar billede olebole Juniormester
18. juni 2007 - 12:53 #4
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.
Avatar billede sw_red_6 Nybegynder
18. juni 2007 - 13:36 #5
Nu er DB ikke blandet ind i det her, men det kan godt være at jeg skal til at lave om på tegnsæt på siden..
Avatar billede olebole Juniormester
18. juni 2007 - 13:49 #6
Yups - og tjek også her hvilket tegnsæt, din server sætter i Content-type header-feltet:
    http://validator.w3.org/detailed.html
Avatar billede sw_red_6 Nybegynder
18. juni 2007 - 14:12 #7
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?
Avatar billede sw_red_6 Nybegynder
18. juni 2007 - 14:14 #8
Det absolut mest underlige er at hvis jeg sætter æ/ø/å ind som første tegn så bliver teksten ikke delt op...
Avatar billede olebole Juniormester
18. juni 2007 - 14:27 #9
Prøv at lægge et link, så jeg kan se eksemplet  =)
Avatar billede sw_red_6 Nybegynder
18. juni 2007 - 15:05 #10
Det kan ikke lige lade sig gøre..
Jeg kan godt se om jeg kan få fat i noget kode fra "vis kilde" men det bliver vidst ikke lige i dag...
Avatar billede horsmark Nybegynder
18. juni 2007 - 15:33 #11
Der hvor det kokser er det selve xml´en der genereres eller når du skal hente en noget xml ud

Hvis det er via simplexml skal du decode lige når du fanger en value fra xml´en uanset om det er iso encoded eller utf

$s = utf8_decode($mitxmltag->minxmlvalue);
Avatar billede sw_red_6 Nybegynder
19. juni 2007 - 16:07 #12
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";

    $itemCount = 0;
    unset($arItems);
    $formattet_data = stripcslashes ($data);

    // main loop
    $xml_parser = xml_parser_create('ISO-8859-1');
    xml_set_element_handler($xml_parser, "startElement", "endElement");
    xml_set_character_data_handler($xml_parser, "LookupData");

  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...
Avatar billede sw_red_6 Nybegynder
19. juni 2007 - 16:10 #13
hrmm, den decode virker i hvert fald ikke..
Og den der ISO-8859-1 er fjernet igen, så det er ikke der fejlen ligger
Avatar billede sw_red_6 Nybegynder
19. juni 2007 - 16:20 #14
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
Avatar billede horsmark Nybegynder
19. juni 2007 - 16:21 #15
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 :-)

http://dk.php.net/simplexml
Avatar billede sw_red_6 Nybegynder
19. juni 2007 - 16:29 #16
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?
Avatar billede horsmark Nybegynder
19. juni 2007 - 16:39 #17
dér hvor du henter data fra xml klumpen via parseren...
Avatar billede olebole Juniormester
20. juni 2007 - 11:17 #18
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)
Avatar billede sw_red_6 Nybegynder
20. juni 2007 - 12:27 #19
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..
Avatar billede horsmark Nybegynder
20. juni 2007 - 12:34 #20
smid lige et par kode linier fra dér hvor du henter noget konkret data ud der bliver til PERSONK?SEL...
Avatar billede sw_red_6 Nybegynder
20. juni 2007 - 12:46 #21
Her er et lille udsnit af koden:

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:";

  if ($curTag == $prefix . "VEHICLEIDENTIFIER") {
    // make new Car
        $itemCount++;
        $glItem++;
    $arItems[$itemCount] = new Car();
    $arItems[$itemCount]->VEHICLEIDENTIFIER = $data;
  }
  elseif ($curTag == $prefix . "VEHICLEIDENTIFICATIONNUMBERTEXT")
  {
    $arItems[$itemCount]->VEHICLEIDENTIFICATIONNUMBERTEXT = $data;
  }
  elseif ($curTag == $prefix . "REGISTRATIONNUMBERTEXT")
  {
    $arItems[$itemCount]->REGISTRATIONNUMBERTEXT = $data;
  }
  elseif ($curTag == $prefix . "VEHICLEMAKENAME")
  {
    $arItems[$itemCount]->VEHICLEMAKENAME = $data;
  }
  elseif ($curTag == $prefix . "VEHICLEMODELNAME")
  {
    $arItems[$itemCount]->VEHICLEMODELNAME = $data;
  }
  elseif ($curTag == $prefix . "VEHICLEVARIANTNAME")
  {
    $arItems[$itemCount]->VEHICLEVARIANTNAME = utf8_decode($data);
  }
  elseif ($curTag == $prefix . "UNLADENMASSMEASURE")
  {
    $arItems[$itemCount]->UNLADENMASSMEASURE = $data;
  }


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"
Avatar billede horsmark Nybegynder
20. juni 2007 - 12:58 #22
det ene sted du laver utf8_decode($data) virker det ikke som det skal ?
Avatar billede sw_red_6 Nybegynder
20. juni 2007 - 13:11 #23
niks, der skriver den ?SEL hvor den ellers skriver ØRSEL så det virker ikke med den utf8_decode
Avatar billede horsmark Nybegynder
20. juni 2007 - 13:31 #24
pas... kan ikke fange problemet da det kræver hands-on *snøft*
Avatar billede sw_red_6 Nybegynder
20. juni 2007 - 13:46 #25
hvis jeg sætter det her:
printf("%s=%s<br>\n", substr($curTag, 100), $data);

ind øverst i det jeg skrev 20/06-2007 12:46:00 kommer den bl.a. med det her output:
VEHICLEUSAGENAME=PRIVAT PERSONK<br>
VEHICLEUSAGENAME=ØRSEL<br>
Avatar billede sw_red_6 Nybegynder
21. juni 2007 - 09:32 #26
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?
Avatar billede horsmark Nybegynder
21. juni 2007 - 09:38 #27
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 :-)
Avatar billede olebole Juniormester
21. juni 2007 - 14:27 #28
Jeg har ikke haft så meget tid til at deltage/'forske' i løsningen, så jeg springer over denne gang ... men tak for tilbudet  ;o)
Avatar billede sw_red_6 Nybegynder
22. juni 2007 - 09:13 #29
det er så i orden..
Avatar billede Ny bruger Nybegynder

Din løsning...

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.

Loading billede Opret Preview
Kategori
Vi tilbyder markedets bedste kurser inden for webudvikling

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester