tors 8 jun 2006
Når man laver web-applikationer, ender man altid med at bruge hysterisk meget tid på teknologiske shortcomings i forskellige applikationer. Noget, som man burde være foruden.
Findvej var ingen undtagelse. I nogle tilfælde kan man diskutere, hvad browseren skal gøre, men i andre har det blot medført irritation, frustration og masser af tid spildt på af finde frem til en browsers præcise opførsel:
Internet Explorer og highbits i URL’en
På Findvej kan man som bekendt skrive adresser ud i ét, fx http://www.findvej.dk/Ørholmgade. Internet Explorer vælger vist som den eneste browser at sende highbits i URL’en som UTF8, når man selv indtaster adressen. Det gør andre browsere ikke.
Det bliver så mere forvirrende af, at det kun er adressen og ikke querystringen, der sendes utf8-encoded. Går man fx ind på “tæst?tæst=tæst” med IE, requestes der “t%C3%A6st?tæst=tæst” (hvor %C3%A6 så er den urlencodede udgave af utf8-udgaven af “æ”).
Det er ikke en løsning bare at hælde fx strengen igennem utf8_decode(), idet det vil ændre “Ørholmgade” til “?holmgade” for andre browsere. En mulighed er at søge på to highbits i træk og så antage, at det er ét utf8-tegn. Det kan dog give problemer med Svinøøstervej og Påøvej – et problem, der måske er så lille, at det kan accepteres. Jeg har dog i stedet valgt manuelt at søg&erstatte helt bestemte utf8-kombinationer af æ, ø, å, é, m.fl.
På den positive side har ingen browsere problemer med at man indtaster mellemrum i URL’en – den sørger selv for at encode det til %20. Det bør de i øvrigt heller ikke have problemer med, idet det alligevel ikke ville give nogen mening at sende mellemrummet med u-encoded (hvilket blot ville give en 400 Bad Request fra webserveren).
Internet Explorer og highbits i URL’en, take 2
Før jeg overhovedet nåede så langt, og da sitet i udviklingsfasen blot havde adressen findvej.dk og ikke www.findvej.dk, gav Internet Explorer nogle mærkelige problemer. Nogle adresser virkede fint, mens andre blot gav en søgeside i stedet for. Det betyder, at nogle direkte adresser virkede, mens andre ikke gjorde. Øvelsen er at lure hvorfor.
Følgende adresser virkede:
- findvej.dk
- findvej.dk/Nybrogade
- findvej.dk/Øresundsvej 1
- www.findvej.dk/Øresundsvej
- www.findvej.dk/Øresundsvej 1
Følgende adresse virkede derimod ikke:
- findvej.dk/Øresundsvej
Nogle gode bud? Ellers kan jeg fortælle, hvad jeg er nået frem til nu i min jagt på Internet Explorers regler, når man indtaster en adresse. Grundlæggende set forholder det sig på denne måde:
- Begynder adressen med www.? Så er det en webadresse
- Hvis ikke, indeholder adressen mellemrum i stien? Så skal specialtegn encodes, og så er det en webadresse.
- Hvis ikke, er der så highbits (som fx æøå) i stien? Så er det nok ikke en adresse, men en søgning, brugeren har gang i.
- Hvis ikke, så er det nok en hjemmesideadresse (med forbehold for domænenavnet i øvrigt)
Benytter man ikke IE, kan man dog stadigvæk nøjes med at indtaste adressen uden www – fx findvej.dk/Øresundsvej – uden problemer. Serveren redirecter blot requests på findvej.dk/… videre til www.findvej.dk/…
Denne IE-opførsel tog mildest talt lang tid at gennemskue. Specielt at mellemrummet gjorde forskel bragte blot mere forvirring på banen.
Safari, XML og forskellige tegnsæt
Jeg er ikke glad for Safari og dets XML-håndtering. Jeg hører nogle Safari/KHTML-brugere brokke sig over IE og den manglende mulighed for at sende sider som application/xhtml+xml. Men Safaris XML-håndtering lader nærmest til at være ikke-eksisterende. Rene XML-dokumenter vises ikke struktureret (men tilsyneladende som HTML), og XML-dokumenter, der refererer til et XSL-stylesheet, bliver heller ikke vist korrekt (hvilket IE og Firefox gør, men Opera tilsyneladende ikke gør).
Jeg vil gætte på, at den manglende implementering også er årsag til et andet problem, Safari-brugere oplever: Når der foretages et adresseopslag i baggrunden (vha. Google Maps APIets GDownloadUri-funktion), hentes der et XML-resultatsæt i UTF-8-format. Selve Findvej-hjemmesiden serveres dog i ISO-8859-1. Det burde ikke give nogen problemer (idet indhold altid skal holdes op imod en encoding, og den samme tekststreng, fx “æble”, kan skrives so to forskellige tekststrenge i forskellige encodings – det er stadigvæk den samme streng), men det gør det alligevel i Safari. Teksterne bliver vist “råt”, altså UTF-8-encoded på siden. Med måske for meget selvsikkerhed i stemmen vil jeg påstå, at det er en bug i Safari. Jeg har dog ikke testet om man finder den samme opførsel i Konquerer.
Mine tre bofæller benytter alle Macs, så Safari er ikke ukendt i hjemmet. Derfor prøvede jeg tidligt at rette jeg encodingen i XML-resultatsættet og angav samtidig explicit den anden encoding. Det betød dog, at IE pludselig ikke længere ville læse XML-filen… om det er IE, APIets XML-funktioner eller hvad, der var årsagen til det problem, har jeg ikke gravet dybere i.
Jeg tror, den bedste løsning/workaround er at lade den almindelige side ligeledes overgå til UTF-8. Det ville være en fin øvelse at vænne sig til at benytte UTF-8. Jeg frygter blot at diverse småværktøjer og editors lige hælder unicode-preamble (Byte Order Mark) ind i filerne eller glemmer at encode eller dobbelt-encoder highbits. Jeg benytter en række forskellige editors og værktøjer, og dette ville jeg gerne blive ved med. Jeg har blot en mistanke om at disse applikationer indeholder lige så mange fejl som browserne.
9. juni 2006, 11:11 am
Hej Pbro – find lille service. Jeg har lidt kommentarer til dine indkodningsproblemer
Punkt 1: Brug UTF8! Altid, hver gang, hver dag
Punkt 2: Jeg synes at det som udgangspunkt giver fin mening, at hvis den modtagende sides tegnsæt er ukendt, antag den kan acceptere UTF8. Det er tydeligvis kun IE der gør dette, men jeg synes faktisk det er en glimrende løsning.
Punkt 3: Firefox havde indtil én af de seneste ændringer en mærkelighed omkring brug af keywords. Jeg har et keyword “dsn” til søgning i DSN og et andet keyword “wpdk” til søgning i den danske Wikipedia.
Men Firefox valgte altid (uanset modtageren, som jo rent faktisk var kendt), at indkode specialtegn i UTF8. Derfor virkede søgninger på “dsn Kødpålæg” og tilsvarende ikke, for DSN bruger iso-8859-1 og kunne derfor ikke forstå forespørgslen.
Nu virker firefox til gengæld korrekt, så den “cacher” modtagersidens (målet for keywordet) tegnsæt og sender specialtegn i det forventede format. Nu kan jeg altså skrive “dsn Kødpålæg” og få http://www.dsn.dk/cgi-bin/ordbog/ronet?P=K%F8dp%E5l%E6g&M=1 samt “wpdk Kødpålæg” og få http://da.wikipedia.org/wiki/Special:Search?search=K%C3%B8dp%C3%A5l%C3%A6g. Det er sgi smart.
Men firefox bruger stadig iso-8859-1 ved almindelige URL’er (hvorfor mon denne forskel i håndtering af direkte adresser versus keywords?), så når jeg skriver http://da.wikipedia.org/wiki/Speciel:Search/Kødpålæg, så sender firefox rent faktisk forespørgslen
GET /wiki/Special:Search/K%F8dp%E5l%E6g HTTP/1.1, hvortil MediaWiki-softwaren passende svarerHTTP/1.0 301 Moved Permanently ... http://da.wikipedia.org/wiki/Speciel:Search/K%C3%B8dp%C3%A5l%C3%A6g.Jeg synes det er spøjst, at når man har lavet det så klogt, at man cacher modtagerens anvendte tegnsæt ved keywords, hvorfor kan man så ikke gøre det for et vilkårligt domæne? Og jeg anser det ikke for mere korrekt på nogen som helst måde altid at forvente iso-8859-1 frem for UTF8. På ingen måde.
11. juni 2006, 3:41 am
Af hensyn til Safari og generel strømlinethed regner jeg med at rette hovedsiden om til at også at benytte UTF-8.
Hvad angår browseres opførsel, så er jeg ikke begejstret for at browseren skulle kunne huske, om et site benytter en bestemt encoding eller ej. Det kan jo i og for sig variere for hver enkelt ressource. Blot fordi eksempel.dk og eksempel.dk/foo benytter utf-8 er det ikke ensbetydende med at eksempel.dk/bar også gør det (eller at eksempel.dk stadigvæk gør det efter et par dage). Vi taler om ikke andet om direkte type-ins.
Egentligt tror jeg, jeg ville foretrække at browsere altid sendte i UTF-8, uanset om vi taler om path’en eller querystrengen. Jeg ved ikke om IE-holdet har skønnet, at UTF-8 er ved at blive udbredt, men at det alligevel ville være for drastisk at rette det i querystrengen. Det er desværre blot ikke specielt konsekvent, at encodingen påvirkes af hvilken side af spørgsmålstegnet, teksten optræder på.
14. juni 2006, 7:07 pm
En måde at reducere tegnsætproblemer er udelukkende at holde sig til ASCII og så enkode ikke-ASCII-tegn på en sprogspecifik måde, fx ‘r\u00F8dgr\u00F8d’ i JavaScript eller ‘rødgr#xF8;d’ i XML. Herved burde eventuelle tegnsætangivelser være overflødige (i teorien, ja).
Mht. at genkende UTF-8 på highbits, så kan det gøres ret pålideligt. Se fx . Det kunne være fiffigt, om PHP og tilsvarende automatisk kunne sørge for at detektere tegnsættet og konvertere til det rette format.
IE har en indstilling på Avanceret-fanebladet, hvor man kan vælge, om den skal sende URL’er UTF-8-enkodet.
Af andre spændende IE-features kan nævnes, at hvis du har en fil liggende på din desktop med navnet http://www.microsoft.com (eller noget andet, der minder om et hostnavn), da vil denne fil blive åbnet i stedet for URL’en http://www.microsoft.com.
14. juni 2006, 7:31 pm
Linket til detektering af UTF-8 blev slugt af kommentarsystemet – her er det igen:
http://www.w3.org/International/questions/qa-forms-utf-8
17. juni 2006, 2:07 am
Det er faktisk et fint utf-8-tjek, der holder ret godt i praksis i forbindelse med skrevet tekst. Alle typiske special-tekst-tegn har byteværdien 11xxxxxx, hvorimod alle bytes i et utf-8-tegn (ud over den første byte) har værdien 10xxxxxx.
Jeg er ikke så begejstret for at introducere en ny sprogspecifik metode, hvor det ikke burde være relevant. Dog kunne jeg være fristet til at lave en javascript-tilføjelse, der UTF-8-decodede outputtet, såfremt man brugte Safari. Dog føler jeg lidt at det er et skridt i den forkerte verden på den måde bare at overgive sig til browser-differentierng – specielt fordi der jo kommer en “ordentlig” Safari-browser, der ikke har det problem (og nogle bruger den allerede).
Jeg har leget lidt med IE-indstillingen tidligere. Jeg er ikke så begejstret for at det rent faktisk er en indstilling, idet det giver endnu mindre mulighed for at antage, hvad brugeren rent faktisk har indtastet, hvis man ikke samtidig kender hans setting her (selv om man kender hans browser).
2. juli 2006, 12:12 am
Hej Peter.
Jeg giver Barklund fuldstændig ret: Brug altid UTF-8. Jeg startede med det erter jeg læste Joel on Software:
“The Absolute Minimum Every Software Developer Absolutely, Positively Must Know About Unicode and Character Sets (No Excuses!)”
http://www.joelonsoftware.com/printerFriendly/articles/Unicode.html
Mine mest benyttede editorer kan UTF-8 uden problemer: Ultraedit, EditPad Pro, Vim, RadRails, Eclipse. Desværre har Topstyle Pro ingen understøttelse (men det er dog begrænset hvad jeg laver af unicode tegn i et CSS stylesheet)
Microsofts editorer har desuden store problemer, og kan vilkårligt finde på at ændre en unicode fil til noget andet, så pas på, hvis du bruger fx Microsoft Visual Studio.
PS. Godt at se dig til Copenhagen Rails Meetup i torsdags! Jakob Skjerning oprettet Copenhagen Rails mailing liste på Copenhagen Rails mailing list (in Danish): http://lists.substancelab.com/mailman/listinfo/copenhagen.rb