23. marts 2006 - 19:44Der er
26 kommentarer og 1 løsning
Encoding - kode vs. server setup
Hej Eksperter.
Jeg har i de senere dage bøvlet lidt med DOM klasserne i PHP, da jeg arbejder med XML i mit Content Management System. Jeg er i den forbindelse blevet opmærksom på at DOM tilsyneladende arbejder med data i UTF-8, og ikke tilpasser sig server-opsætningen. Ligeledes synes jeg at se en tendens til at flere og flere tager UTF-8 til sig.
Mit spørgsmål er derfor hvordan jeg skal kode op mod DOM objekterne - bør jeg blot acceptere at DOM arbejder i UTF-8, og dermed lade alle data i mine egne klasser (nogen nedarver fra DOMDocument) returnere data i UTF-8 format? Eller er den "rigtige" løsning at tjekke server-opsætningen, og så lade mine klasse konvertere i forhold til denne hvis der er behov for det?
I øvrigt finder jeg det tæt på utilgiveligt at de laver klasserne så de kun kan arbejde i UTF-8. Hvad er ideen så med de properties hvor man kan sætte og aflæse encoding-typen? Er det i øvrigt et generelt problem for PHPs klasser - at de kun arbejder i UTF-8 ?
Ja, det er rigtigt - Det var da lidt latterligt. Selv hvis du opretter xml dokumentet som iso-8859-1 så forventer createTextNode at inputtet er utf8... Det lader ikke til at der er en work-around i php - Så mit forslag er at lave din egen DOM som bare nedarver fra php's, så kan du override createTextNode og hvad der ellers måtte være - Men det er klart ikke den fedeste løsning ;P
Det virker i øvrigt hvis du bare kalder saveXML på den node hvor der er æøå i - det er kun hvis du kalder saveXML uden parametre, altså så det er hele dokumentet at det går galt. Virker lidt bug-agtigt.
Enig, det virker en smule galt. Hvad skulle ideen være med at angive en encoding når den ikke virker? Men det er muligvis en "place holder" for noget funktionalitet der følger senere.
Sagen er netop også den, at jeg arver fra DOMDocument - altså 'extender' min egen klasse. Men jeg er ikke helt med på hvad du mener i din sidste kommentar (23/03-2006 22:31:56). Jeg er jo ikke interesseret i at gemme enkelte noder - jeg ønsker at gemme hele mit dokument.
Hvordan bør jeg i øvrigt behandle output data fra mine klasser? Jeg har en række get-metoder, som returnerer data - og pt. må de vel blive returneret i UTF-8. Men min server er sat op med ISO-8859-1. Så det giver nogle mørkelige ÆØÅ'er. Og da min løsning skal kunne køre på flere forskellige servere, så ville det vel være ideelt hvis mine get-metoder outputtede data i enten ISO-8859-1 eller UTF-8, alt efter hvad serveren er indstillet til. Eller hvad mener du?
Ja, jeg har ikke lige tænkt over det - Din skal vel være parent::createTextNode ser ok ud, men måske kan man detecte om $str er utf8 - Men jeg ved ikke om det er nødvendigt :) Outputter dine metoder utf8? saveXML outputter iso-8859-1 for mig, selvom createTextNode skal have utf8...
Coder > Ah ja. Det skal nok være parent i stedet for this. Men jeg tror nærmere man skal detecte _serverens_ indstillinger, og så evt. outputte i forhold til det. Alternativt må man pille ved headeren når data sendes, og dermed sende alt i UTF-8. Skal ikke kunne sige om det er god praksis. I øvrigt outputter saveXML() og save("data.xml") også i ISO-8859-1 hos mig - men det ændre ikke på at hvis jeg henter data ind fra dokumentet, så er det i UTF-8. Jeg benytter tilmed SimpleXML-klassen til at skabe mine DOMDocument objekter (til at populere data i dem). Så heller ikke den synes at have ordentlig encoding support. Den læser i hvertfald ikke encodingen fra XML dokumentet.
Arne > Ok, super. Det er bestemt værd at tage med i overvejelserne. Hvad vil du mene er den rette løsning til dette problem? At outputte i den encoding serveren bruger? Eller at modificere headeren og outputte alt i UTF-8?
Jeg ville mene at det ville være bedst at "bide i det sure æble", hvis det kan siges sådan, og så outputte alt i UTF-8. Så er det fremtidssikret, og vil sikkert skabe mindst problemer i forhold til klienterne ;)
Jeg er dog stadig forvirret over måden PHP håndterer encoding på. Hvis serveren er sat op til at bruge UTF-8 som standard, hvorfor får jeg så stadig fejl når jeg placerer data i mine DOM objekter? De burde vel være encodet i UTF-8!?
Ah, har indset at det afhænger af hvilken type encoding jeg bruger på mine dokumenter. Har jeg fx en PHP fil med nedenstående indhold encodet i ISO-8859-1, og jeg kører UTF-8 på serveren, så vil det blive noget volapyk.
Nedenstående indlæg i et forum opsummerer rimelig fint hvordan jeg har det lige nu. Min opfattelse er at der er fuldstændig inkonsistens i mellem en masse elementer, som gør det meget besværligt at lave internationale applikationer. Jeg er så småt ved at gå tilbage til en ren ISO-8859-1 applikation, som blot konverterer mellem UTF-8 og ISO-8859-1 i mine DOM* objekter.
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.