marts 2nd, 2008. Kategori: Webudvikling | 21 Kommentarer »
Det er min 3. artikel om danske tegnsæts problemer. Igen efter at have oplevet fejl med de danske specialtegn: æ, ø og å. Det er det danske tegnsæt latin1, der driller.
Den tekniske betegnelse for latin1 tegnsættet er ISO-8859-1 eller ISO-8859-15. Og når vi definere vores tegnsæt som et latin1 tegnsæt skal vi bruge de tekniske navne.
PHP. Fra utf-8 til ISO-8859-1
Jeg havde loadet noget XML ind på en webside i form af et RSS feed. Jeg brugte simplexml_load_file() funktionen til denne opgave. Simple_load_xml leverer XML’en med utf-8 tegnsæt, og det giver problemer, når min hjemmeside er kodet med ISO-8859-1 tegnsæt. Både overskrifter og indhold var ulæseligt på grund af manglende æ’er, ø’er og å’er.
Heldigvis var løsningen nær, php-funktionen: utf8_decode().
utf8_decode($minTekst);
utf8_decode tager en streng og omdanner den fra utf-8 til ISO-8859-1/latin1. Det kan næsten ikke blive mere simpelt. Og så virker det.
Et eksempel med uft8_decode()
Her er et lidt mere komplekst eksempel fra det virkelige liv. Scriptet henter et RSS feed fra DR’s kultur sektion.
<?php
// RSS feeden hentes. Gemmes som obejct i $feed
$feed = simplexml_load_file(‘http://www.dr.dk/nyheder/service/feeds/kultur’);
//channel og item nodes løbes igennem.
//Channel er parent, her hentes oplysninger om RSS-feeden
//Item er child og har selv flere children som feks: title, description, pubDate og link
//alt kørt igennem utf8_decode() Der returner iso ISO-8859-1
foreach($feed->channel as $channel){
print utf8_decode(“Kanal:<a href='{$channel->link}’> {$channel->title}</a><br/>”);
foreach($feed->channel->item as $item){
print utf8_decode(“<a href='{$item->link}’>{$item->title}</a><br/>”);
print utf8_decode(“{$item->pubDate} <br/>”);
print utf8_decode(“{$item->description} <br/><br/>”);
}
}
?>
utf8_decode funktionen er brugt på alle print komandoerne, og tegnsætsproblemet er løst … for denne gang. 😉
Skift tegnsæt med iconv()
Hvis ovenstående ikke løste dit tegnsæt problem med de danske bogstaver, kan du istedet bruge php-funktionen iconv(). iconv-funktionen konverterer mellem forskellige tegnsæt. Og man kan vel og mærke frit vælge de tegnsæt man vil konvertere imellem.
Vil man f.eks. konverterer mellem det danske ISO-8859-1/latin1 tegnsæt og utf-8, ser løsningen sådan ud:
iconv ( (“ISO-8859-1”, “UTF-8”, $minTekst);)
Jeg har f.eks. brugt denne konverterings metode til at finde det rette tegnsæt efter at mine æ, ø og å’er var blevet ødelagt af et AJAX kald. Netop AJAX kan være særlig drilsk, så det kan det være nødvendigt at eksperimentere med forskellige løsninger.
Se også min tutorial til en simpel RSS reader med PHP