Avatar billede webcreator Nybegynder
23. marts 2006 - 19:44 Der 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?

Jeg håber jeg kan få lidt råd med på vejen :)
Avatar billede webcreator Nybegynder
23. marts 2006 - 19:49 #1
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 ?
Avatar billede coderdk Praktikant
23. marts 2006 - 21:26 #2
Den kan da godt arbejde i andet end utf-8: http://dk.php.net/manual/en/function.dom-domdocument-construct.php

dom = new DOMDocument('1.0', 'iso-8859-1');
Avatar billede webcreator Nybegynder
23. marts 2006 - 21:44 #3
Prøv at indsætte et element i dit dokument der indeholder 'æøå' uden at encode det i UTF-8. Så vil du få flg. fejl :

Warning: output conversion failed due to conv error, bytes 0xC6 0x2D 0xD8 0x2D in /var/www/test.class.php on line X
Avatar billede webcreator Nybegynder
23. marts 2006 - 21:45 #4
Indsætter jeg mine data som UTF-8 - vha. metoden utf8_encode() - så har jeg ingen problemer.
http://dk.php.net/manual/fi/function.utf8-encode.php
Avatar billede webcreator Nybegynder
23. marts 2006 - 22:19 #5
Jeg må hellere lige tilføje, at du vist først får fejlen når du kalder save() på dit DOMDocument objekt - altså gemmer din XML i en fil.
Avatar billede coderdk Praktikant
23. marts 2006 - 22:30 #6
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
Avatar billede coderdk Praktikant
23. marts 2006 - 22:31 #7
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.
Avatar billede webcreator Nybegynder
23. marts 2006 - 22:38 #8
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.
Avatar billede webcreator Nybegynder
23. marts 2006 - 22:39 #9
Hvordan vil du i øvrigt mene at en overridden createTextNode()-metode skulle se ud? Noget i retning af nedenstående? (ikke testet):

public function createTextNode($str)
{
  return $this->createTextNode(utf8_encode($str));
}
Avatar billede webcreator Nybegynder
23. marts 2006 - 22:43 #10
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?
Avatar billede coderdk Praktikant
24. marts 2006 - 01:38 #11
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...
Avatar billede arne_v Ekspert
24. marts 2006 - 04:14 #12
Hvis man nærlæser XML specs, så står der faktisk at alle XML applikationer
skal understøtte UTF-8. ISO-8859-1 er optional.

UTF-8 er vejen frem når det drejer sig om XML.
Avatar billede arne_v Ekspert
24. marts 2006 - 04:15 #13
(og med kinas stigende betydning på internettet også for mange andre
web ting)
Avatar billede webcreator Nybegynder
24. marts 2006 - 16:04 #14
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?
Avatar billede arne_v Ekspert
24. marts 2006 - 16:09 #15
Jeg har aldrig arbejdet med XML i PHP, saa det skal jeg ikke goere mig
klog paa det konkrete.

Jeg gav bare lidt baggrund til hvorfor XML kan vaere meget UTF-8 centric.

Generelt ville jeg nok holde XML i UTF-8, men generelt er jo saadan
"medmindre der er gode grunde til andet"
Avatar billede coderdk Praktikant
24. marts 2006 - 16:10 #16
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 ;)
Avatar billede webcreator Nybegynder
24. marts 2006 - 16:17 #17
Ok. Så løsningen er altså at modificere headeren, right? Noget i retning af:
header("Content-Transfer-Encoding: UTF-8");
Avatar billede webcreator Nybegynder
24. marts 2006 - 16:35 #18
Oh, det er vist nærmere
header("Content-type: text/css; charset=UTF-8");
Avatar billede webcreator Nybegynder
24. marts 2006 - 16:51 #19
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!?
Avatar billede webcreator Nybegynder
24. marts 2006 - 18:55 #20
Anyone ?
Avatar billede webcreator Nybegynder
24. marts 2006 - 23:05 #21
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.

<?php echo "ÆØÅ"; ?>
Avatar billede webcreator Nybegynder
24. marts 2006 - 23:10 #22
Så der er flere ting at holde øje med.

1) Encoding på filen som indeholder kode
2) Encoding på serveren (eller kode-mæssigt ændre encoding i headeren)
3) Encoding i DOM objekterne
Avatar billede webcreator Nybegynder
25. marts 2006 - 14:36 #23
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.

http://www.webmasterworld.com/forum88/2256.htm
Avatar billede webcreator Nybegynder
25. marts 2006 - 14:46 #24
I må begge to forresten gerne smide et svar ved lejlighed. Jeg har afsat lidt flere points til jer :)
Avatar billede arne_v Ekspert
25. marts 2006 - 22:00 #25
jeg ville nok hve satset på at konvertere det hele til UTF-8

ingen point til mig - mit bidrag har kun været nogle generelle betragtninger
Avatar billede coderdk Praktikant
26. marts 2006 - 01:16 #26
Enig, utf-8 lyder som vejen at gå :)
Avatar billede webcreator Nybegynder
28. marts 2006 - 00:25 #27
Jeg siger tak for hjælpen så :)
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