Hoe krijg ik die rare tekens weg

Elke feed heeft een specifiek karakter codering. Als in de keten van het maken van de feed, het opsturen van de feed, ophalen van de feed, het parsen, het in de database zetten en het uiteindelijk weergeven in joomla iets fout gedaan wordt krijg je rare tekens waar umlauts of andere niet standaard tekens staan.

 

PHP4

Onder php4 is de automatische detectie van de codering door de parser niet goed, dat is een probleem van php en kan niet opgelost worden. Daarom wordt voor php4 de te verwachten codering altijd op UTF-8 gezet. Als de codering van de feed afwijkt (daisycon) (en dan is het meestal ISO-8859-1) moet je dat handmatig instellen in het feeds menu.

Codering CSV Bestanden

CSV bestanden bevatten geen coderings informatie. Hier moet je bij de aanbieder 'ISO-8859-1' als codering van de feed instellen, of ook hier 'Auto encoding' uitzetten en bij 'Encoding' 'UTF-8'

 

 

 

 

Dubbel codering / foute codering

Sommige feeds zijn dubbel gecodeerd, bij het maken van de feed zijn gegevens in UTF-8 nogmaals als UTF-8 gecodeerd of UTF-8 gecodeerde data gaat als ISO-8859-1 de deur uit. Het laatste probleem is vaak op te lossen door de codering handmatig op UTF-8 te zetten. Een dubbele codering door gebruik te maken van een callback functie:

<?
function dubbelutf8_cb(&$item,$count=0){

   foreach (
$item as $k => $v ) {

      
$item[$k]=utf8_decode($v);

    }

    
generic_cb($item);

}
?>

Deze functie wordt meegeleverd met de compoment  Staat in administrator/components/com_datafeeds/cron  feeds-example.php of reeds in feeds.php.

En in de instellingen van de feed gebruik je dan dubbelutf8_cb in plaats van generic_cb.

XML character entity referenties

Er zijn een aantal feeds die speciale karakters coderen als html_entity, dit is op zich correct maar onnodig in XML.

Daarnaast zijn er feeds die html entity's ook weer url encodere, dat kan fout zijn

Het levert problemen op als de tekens in de menu's terecht komen. Gebruik html_entity_decode om dit op te lossen.

<title><![CDATA[Speciaal Karakter ê  wat het zou moeten zijn ]]>
       </title>

<title><![CDATA[Speciaal Karakter &#234; goed maar onnodig]]></title>

<title>Speciaal Karakter &​amp;#234; goed</title>

<title>Speciaal Karakter &#234; fout</title>

<title><![CDATA[Speciaal Karakter &​amp;#234; fout]]></title>

Vanaf versie 384 worden html entities van geselecteerde velden m.u.v. de description standaard gecodeerd naar ISO/UTF-8.

<?
#decoderen html_entity naar karkaterset
function voorbeeld_cb(&$item);
  
$item['description']=html_entity_decode($item['description']);
  
generic_cb($item);
}
# oplossen dubbel codering
# zou met een dubbel html_entity_decode kunnen, maar het gaat altijd 
       om de
# &​amp;
function voorbeeld_dubbel_cb(&$item);
  
$item['country']=str_replace("amp;","",$item['country']);
  
$item['country']=html_entity_decode($item['country']);
  
generic_cb($item);
}


 

 

 

 

 

Andere problemen

Met name php 4 ondersteund (de)codering niet goed. En sommige feeds werken dan ook nog eens niet mee. Een voorbeeld:

de summum/baobab feeds gebruiken  & #235; voor ë ( dit ipv & euml;). De entity zou je met html_entity_decode() moeten kunnn converteren. Met php 5 gaat dat prima. Helaas niet met php 4. Hier werkt iets als :

preg_replace('~&#([0-9]+);~e', 'chr("\\1")',$string);

 

Zie ook function.html-entity-decode.php

 

 

 

 

 

Plaats reactie


Beveiligingscode
Vernieuwen

Doneer

Donate $10, $20 or $50! This plugin has cost me countless hours of work, if you use it, please donate a token of your appreciation!