Oprettet man. d. 18. juni 2007 kl. 12:07:42

sw_red_6
sw_red_6 (16.675 point. Point ude: 60)

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?

Skrevet man. d. 18. juni 2007 kl. 12:21:31| #1

olebole
olebole (214.028 point)
<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>

Skrevet man. d. 18. juni 2007 kl. 12:23:28| #2

olebole
olebole (214.028 point)
... 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?

Skrevet man. d. 18. juni 2007 kl. 12:38:00| #3

sw_red_6
sw_red_6 (16.675 point)
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?

Skrevet man. d. 18. juni 2007 kl. 12:53:35| #4

olebole
olebole (214.028 point)
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.

Skrevet man. d. 18. juni 2007 kl. 13:36:07| #5

sw_red_6
sw_red_6 (16.675 point)
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..

Skrevet man. d. 18. juni 2007 kl. 13:49:08| #6

olebole
olebole (214.028 point)
Yups - og tjek også her hvilket tegnsæt, din server sætter i Content-type header-feltet:
    http://validator.w3.org/ (...)

Skrevet man. d. 18. juni 2007 kl. 14:12:56| #7

sw_red_6
sw_red_6 (16.675 point)
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?

Skrevet man. d. 18. juni 2007 kl. 14:14:39| #8

sw_red_6
sw_red_6 (16.675 point)
Det absolut mest underlige er at hvis jeg sætter æ/ø/å ind som første tegn så bliver teksten ikke delt op...

Skrevet man. d. 18. juni 2007 kl. 14:27:14| #9

olebole
olebole (214.028 point)
Prøv at lægge et link, så jeg kan se eksemplet  =)

Skrevet man. d. 18. juni 2007 kl. 15:05:45| #10

sw_red_6
sw_red_6 (16.675 point)
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...

Skrevet man. d. 18. juni 2007 kl. 15:33:12| #11

horsmark
horsmark (32.038 point)
www.horsmark.com
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);

Skrevet tir. d. 19. juni 2007 kl. 16:07:15| #12

sw_red_6
sw_red_6 (16.675 point)
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...

Skrevet tir. d. 19. juni 2007 kl. 16:10:35| #13

sw_red_6
sw_red_6 (16.675 point)
hrmm, den decode virker i hvert fald ikke..
Og den der ISO-8859-1 er fjernet igen, så det er ikke der fejlen ligger

Skrevet tir. d. 19. juni 2007 kl. 16:20:45| #14

sw_red_6
sw_red_6 (16.675 point)
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

Skrevet tir. d. 19. juni 2007 kl. 16:21:33| #15

horsmark
horsmark (32.038 point)
www.horsmark.com
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/ (...)

Skrevet tir. d. 19. juni 2007 kl. 16:29:15| #16

sw_red_6
sw_red_6 (16.675 point)
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?

Skrevet tir. d. 19. juni 2007 kl. 16:39:28| #17

horsmark
horsmark (32.038 point)
www.horsmark.com
dér hvor du henter data fra xml klumpen via parseren...

Skrevet ons. d. 20. juni 2007 kl. 11:17:18| #18

olebole
olebole (214.028 point)
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)

Skrevet ons. d. 20. juni 2007 kl. 12:27:55| #19

sw_red_6
sw_red_6 (16.675 point)
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..

Skrevet ons. d. 20. juni 2007 kl. 12:34:54| #20

horsmark
horsmark (32.038 point)
www.horsmark.com
smid lige et par kode linier fra dér hvor du henter noget konkret data ud der bliver til PERSONK?SEL...

Skrevet ons. d. 20. juni 2007 kl. 12:46:00| #21

sw_red_6
sw_red_6 (16.675 point)
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"

Skrevet ons. d. 20. juni 2007 kl. 12:58:12| #22

horsmark
horsmark (32.038 point)
www.horsmark.com
det ene sted du laver utf8_decode($data) virker det ikke som det skal ?

Skrevet ons. d. 20. juni 2007 kl. 13:11:22| #23

sw_red_6
sw_red_6 (16.675 point)
niks, der skriver den ?SEL hvor den ellers skriver ØRSEL så det virker ikke med den utf8_decode

Skrevet ons. d. 20. juni 2007 kl. 13:31:46| #24

horsmark
horsmark (32.038 point)
www.horsmark.com
pas... kan ikke fange problemet da det kræver hands-on *snøft*

Skrevet ons. d. 20. juni 2007 kl. 13:46:35| #25

sw_red_6
sw_red_6 (16.675 point)
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>

Skrevet tor. d. 21. juni 2007 kl. 09:32:51| #26

sw_red_6
sw_red_6 (16.675 point)
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?

Skrevet tor. d. 21. juni 2007 kl. 09:38:18| #27

horsmark
horsmark (32.038 point)
www.horsmark.com
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 :-)

Skrevet tor. d. 21. juni 2007 kl. 14:27:24| #28

olebole
olebole (214.028 point)
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)

Skrevet fre. d. 22. juni 2007 kl. 09:13:25| #29

sw_red_6
sw_red_6 (16.675 point)
det er så i orden..

Skriv et indlæg




Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] [img]link til billede[/img]
Web- og emailadresser omdannes automatisk til links

Log ind

   

   

Seneste spørgsmål

Ville ikke tildele at upload det til database eller komme...

Oprettet den 10. februar 2012 kl. 21.23
tobrukDk giver 15 point for svar | Giv et svar »

HTTP Post XML og modtag svar

Oprettet den 10. februar 2012 kl. 17.55
mrkaynex giver 200 point for svar | Giv et svar »

Inspion Economy søger en dygtig programmør, som kan...

Oprettet den 10. februar 2012 kl. 16.09
Kathja giver 15 point for svar | Giv et svar »

Seneste guides

Installer win 7
Den gode bruger


   




Tips & Tricks fra PC World

Teaser billede

Her er fem sjove danske websider du skal kende

Trænger dine lattermuskler til en omgang fitness på dansk? Vi viser vej til fem websider fyldt med humor og vanvittig satire.


Anmeldelser fra PC World

Teaser billede

Test: Denne super-tablet er iPads hårdeste konkurrent

Eee Pad Transformer Prime er frygtindgydende med sin quadcore processor og evne til at trylle sig om til bærbar. Apple bør kigge i bagspejlet, for Asus' tablet-pc kommer buldrende - og gør det...


Seneste blogindlæg

Teaser billede

Tvangslukke spørgsmål: Hvad er den bedste løsning?

Hej Vi har mange åbne spørgsmål på Eksperten. Vi ville gerne tvangslukke dem - så et spørgsmål efter f.eks. 6 måneder lukkes. Men der er et par uklarheder som ville være gode at få lidt input til:...


Nyheder fra PC World

Teaser billede

Nu kan du snart hente Windows 8

Den nye offentlige betaversion af Windows 8 er klar i denne måned.


Nyheder fra Computerworld

Teaser billede

Måske snart slut med Androids helt store problem

Android-platformen har længe været plaget af et særligt problem. Men måske er problemet nu ved at være elimineret.


Kurser
Samarbejdspartnere

Udgiver · © 2012 IDG Danmark A/S · Hørkær 18 · 2730 Herlev · Tlf.: 77 300 300 · Fax: 77 300 301 · Brug af personoplysninger