Skrevet man. d. 18. juni 2007 kl. 12:21:31| #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>
Skrevet man. d. 18. juni 2007 kl. 12:23:28| #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?
Skrevet man. d. 18. juni 2007 kl. 12:38:00| #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?
Skrevet man. d. 18. juni 2007 kl. 12:53:35| #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.
Skrevet man. d. 18. juni 2007 kl. 13:36:07| #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..
Skrevet man. d. 18. juni 2007 kl. 13:49:08| #6
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
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
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
Prøv at lægge et link, så jeg kan se eksemplet =)
Skrevet man. d. 18. juni 2007 kl. 15:05:45| #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...
Skrevet man. d. 18. juni 2007 kl. 15:33:12| #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);
Skrevet tir. d. 19. juni 2007 kl. 16:07:15| #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...
Skrevet tir. d. 19. juni 2007 kl. 16:10:35| #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
Skrevet tir. d. 19. juni 2007 kl. 16:20:45| #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
Skrevet tir. d. 19. juni 2007 kl. 16:21:33| #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/ (...)
Skrevet tir. d. 19. juni 2007 kl. 16:29:15| #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?
Skrevet tir. d. 19. juni 2007 kl. 16:39:28| #17
dér hvor du henter data fra xml klumpen via parseren...
Skrevet ons. d. 20. juni 2007 kl. 11:17:18| #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)
Skrevet ons. d. 20. juni 2007 kl. 12:27:55| #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..
Skrevet ons. d. 20. juni 2007 kl. 12:34:54| #20
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
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
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
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
pas... kan ikke fange problemet da det kræver hands-on *snøft*
Skrevet ons. d. 20. juni 2007 kl. 13:46:35| #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>
Skrevet tor. d. 21. juni 2007 kl. 09:32:51| #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?
Skrevet tor. d. 21. juni 2007 kl. 09:38:18| #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 :-)
Skrevet tor. d. 21. juni 2007 kl. 14:27:24| #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)
Skrevet fre. d. 22. juni 2007 kl. 09:13:25| #29