{"id":132,"date":"2008-03-02T23:37:08","date_gmt":"2008-03-02T22:37:08","guid":{"rendered":"http:\/\/www.nielsgamborg.dk\/wordpress\/webudvikling\/php-og-dansk-tegns%c3%a6t-%c3%a6-%c3%b8-og-a-fejl-fra-utf-8-til-iso-8859-1.htm"},"modified":"2008-03-02T23:37:08","modified_gmt":"2008-03-02T22:37:08","slug":"php-og-dansk-tegnsaetae-oe-aa-fejl-fra-utf-8-til-iso-8859-1","status":"publish","type":"post","link":"https:\/\/nielsgamborg.dk\/wordpress\/webudvikling\/php-og-dansk-tegnsaetae-oe-aa-fejl-fra-utf-8-til-iso-8859-1.htm","title":{"rendered":"PHP og dansk tegns\u00e6t. \u00c6, \u00f8 og \u00e5 fejl. Fra utf-8 til ISO-8859-1"},"content":{"rendered":"<p>Det er\u00a0min 3. artikel om <strong>danske tegns\u00e6ts problemer<\/strong>. Igen\u00a0efter at have oplevet\u00a0fejl med\u00a0de danske specialtegn: \u00e6, \u00f8 og \u00e5. Det er det danske tegns\u00e6t latin1, der driller.<\/p>\n<p>Den\u00a0tekniske betegnelse for <strong>latin1<\/strong> tegns\u00e6ttet er <strong>ISO-8859-1<\/strong> eller <strong>ISO-8859-15<\/strong>. Og n\u00e5r vi definere vores tegns\u00e6t som et latin1 tegns\u00e6t skal vi bruge de tekniske navne.<\/p>\n<h3>PHP. Fra utf-8 til ISO-8859-1<\/h3>\n<p>Jeg havde loadet noget XML ind p\u00e5 en webside i form af et RSS feed.\u00a0Jeg brugte <strong>simplexml_load_file()<\/strong> funktionen til denne opgave.\u00a0 Simple_load_xml leverer XML&#8217;en med utf-8 tegns\u00e6t, og det giver problemer, n\u00e5r min hjemmeside er kodet med ISO-8859-1 tegns\u00e6t. \u00a0B\u00e5de overskrifter og\u00a0indhold var ul\u00e6seligt p\u00e5 grund af manglende \u00e6&#8217;er, \u00f8&#8217;er og \u00e5&#8217;er.<\/p>\n<p>Heldigvis\u00a0var l\u00f8sningen n\u00e6r, php-funktionen:\u00a0<strong>utf8_decode()<\/strong>.<\/p>\n<blockquote><p>utf8_decode($minTekst);<\/p><\/blockquote>\n<p>utf8_decode tager en streng og omdanner den fra utf-8 til ISO-8859-1\/latin1. Det kan n\u00e6sten ikke blive mere simpelt. Og s\u00e5 virker det.<\/p>\n<h3>Et eksempel med uft8_decode()<\/h3>\n<p>Her er et lidt mere komplekst eksempel fra det virkelige liv.\u00a0\u00a0Scriptet henter et RSS feed fra DR&#8217;s kultur sektion.<\/p>\n<blockquote><p>\u00a0\u00a0&lt;?php<br \/>\n\u00a0\u00a0<br \/>\n\u00a0\u00a0\u00a0<span style=\"color: #99cc00;\">\/\/ RSS feeden hentes. Gemmes som obejct i $feed<\/span><br \/>\n\u00a0\u00a0\u00a0$feed = simplexml_load_file(&#8216;http:\/\/www.dr.dk\/nyheder\/service\/feeds\/kultur&#8217;);<br \/>\n\u00a0\u00a0\u00a0<\/p>\n<p>\u00a0\u00a0<span style=\"color: #99cc00;\">\u00a0\/\/channel og item nodes l\u00f8bes igennem.<br \/>\n\u00a0\u00a0\u00a0\/\/Channel er parent, her hentes oplysninger om RSS-feeden<br \/>\n\u00a0\u00a0\u00a0\/\/Item er child og har selv flere children som feks: title, description, pubDate og link<br \/>\n\u00a0\u00a0\u00a0\/\/alt k\u00f8rt igennem utf8_decode() Der returner iso ISO-8859-1<\/span><br \/>\n\u00a0\u00a0\u00a0foreach($feed-&gt;channel as $channel){<br \/>\n\u00a0\u00a0\u00a0\u00a0print utf8_decode(&#8220;Kanal:&lt;a href='{$channel-&gt;link}&#8217;&gt; {$channel-&gt;title}&lt;\/a&gt;&lt;br\/&gt;&#8221;);<br \/>\n\u00a0\u00a0\u00a0\u00a0foreach($feed-&gt;channel-&gt;item as $item){<br \/>\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0print utf8_decode(&#8220;&lt;a href='{$item-&gt;link}&#8217;&gt;{$item-&gt;title}&lt;\/a&gt;&lt;br\/&gt;&#8221;);<br \/>\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0print utf8_decode(&#8220;{$item-&gt;pubDate} &lt;br\/&gt;&#8221;);<br \/>\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0print utf8_decode(&#8220;{$item-&gt;description} &lt;br\/&gt;&lt;br\/&gt;&#8221;);<br \/>\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0}\u00a0<br \/>\n\u00a0\u00a0\u00a0}<br \/>\n\u00a0\u00a0\u00a0<br \/>\n\u00a0\u00a0?&gt;<\/p><\/blockquote>\n<p>utf8_decode funktionen er brugt p\u00e5 alle print komandoerne, og tegns\u00e6tsproblemet er l\u00f8st &#8230; for denne gang. \ud83d\ude09<\/p>\n<h3>Skift tegns\u00e6t med iconv()<\/h3>\n<p>Hvis ovenst\u00e5ende ikke l\u00f8ste dit tegns\u00e6t\u00a0problem med de danske bogstaver, \u00a0kan du istedet bruge php-funktionen <span class=\"methodname\"><strong><strong>iconv().<\/strong><\/strong><\/span> iconv-funktionen\u00a0konverterer mellem forskellige tegns\u00e6t.\u00a0Og man kan vel og m\u00e6rke frit v\u00e6lge de tegns\u00e6t man vil konvertere imellem.<\/p>\n<p>Vil man f.eks. konverterer mellem det danske ISO-8859-1\/latin1 tegns\u00e6t og utf-8, ser l\u00f8sningen s\u00e5dan ud:<\/p>\n<blockquote><p><span class=\"type\">iconv<\/span>\u00a0( <span class=\"methodparam\"><span class=\"type\">(&#8220;ISO-8859-1&#8221;, &#8220;UTF-8&#8221;, $minTekst);<\/span><\/span>)<\/p><\/blockquote>\n<p>Jeg har f.eks. brugt denne konverterings metode til at finde det rette tegns\u00e6t efter at mine \u00e6, \u00f8 og \u00e5&#8217;er var blevet \u00f8delagt af et AJAX kald. Netop AJAX kan v\u00e6re s\u00e6rlig drilsk, s\u00e5 det kan det v\u00e6re n\u00f8dvendigt at eksperimentere med forskellige l\u00f8sninger.<\/p>\n<p>\u00a0Se ogs\u00e5 min <a title=\"RSS feed reader i PHP\" href=\"http:\/\/www.nielsgamborg.dk\/index.php?p=php&amp;u=rss_feed_reader\">tutorial til en simpel RSS reader med PHP<\/a><\/p>\n","protected":false},"excerpt":{"rendered":"<p>Det er\u00a0min 3. artikel om danske tegns\u00e6ts problemer. Igen\u00a0efter at have oplevet\u00a0fejl med\u00a0de danske specialtegn: \u00e6, \u00f8 og \u00e5. Det er det danske tegns\u00e6t latin1, der driller. Den\u00a0tekniske betegnelse for latin1 tegns\u00e6ttet er ISO-8859-1 eller ISO-8859-15. Og n\u00e5r vi definere vores tegns\u00e6t som et latin1 tegns\u00e6t skal vi bruge de tekniske navne. PHP. Fra utf-8 [&hellip;]<\/p>\n","protected":false},"author":3,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":[],"categories":[19],"tags":[25,99,203,208,261,296],"_links":{"self":[{"href":"https:\/\/nielsgamborg.dk\/wordpress\/wp-json\/wp\/v2\/posts\/132"}],"collection":[{"href":"https:\/\/nielsgamborg.dk\/wordpress\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/nielsgamborg.dk\/wordpress\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/nielsgamborg.dk\/wordpress\/wp-json\/wp\/v2\/users\/3"}],"replies":[{"embeddable":true,"href":"https:\/\/nielsgamborg.dk\/wordpress\/wp-json\/wp\/v2\/comments?post=132"}],"version-history":[{"count":0,"href":"https:\/\/nielsgamborg.dk\/wordpress\/wp-json\/wp\/v2\/posts\/132\/revisions"}],"wp:attachment":[{"href":"https:\/\/nielsgamborg.dk\/wordpress\/wp-json\/wp\/v2\/media?parent=132"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/nielsgamborg.dk\/wordpress\/wp-json\/wp\/v2\/categories?post=132"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/nielsgamborg.dk\/wordpress\/wp-json\/wp\/v2\/tags?post=132"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}