[PHP/XML] Character encoding en str_replace

Pagina: 1
Acties:

Onderwerpen


Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
He jongens,

Ik zit met een raar probleempje. Ik heb een php bestand waarin ik een xml-file genereer. Wanneer ik het bestand dus aanroep, krijg ik netjes XML te zien.

Ik heb het bestand geencode ge-encode met 'iso-8859-1'.
Het betreft een sitemap en daarin moeten natuurlijk alle url's staan van de website. Op de website zelf maak ik SEO-vriendelijke url's, dat wil zeggen:
ik maak bijvoorbeeld www.example.com/2/hello-world.html

Het hello-world wordt opgebouwd aan de hand van een naam uit de database, maar deze naam kan bijvoorbeeld ook tekens bevatten als ö en ò.

Om deze gewoon te veranderen in een 'o' gebruik ik in een functie onderandere hetvolgende:
$title = str_replace(array("ð","ò","ó","õ","ö"),"o",$title);

Op de website werkt dit perfect, zo zet ik bijvoorbeeld eerder in de functie een spatie om naar een -.

In de XML echter, werkt deze functie niet en krijg ik doodleuk 2/hellò-wòrld.html, dat kan natuurlijk niet, want dan heb ik in de sitemap een andere url staan dan dat op de website gebruikt wordt.

Heeft iemand enig idee waarom in xml, met dezelfde functie als in de website, de characters niet worden omgezet, terwijl dit in php wel gebeurd?

Alvast bedankt!

[ Voor 0% gewijzigd door Verwijderd op 26-06-2008 08:25 . Reden: geencode -> ge-encode ]


Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
Aanvulling:

Overigens zie je boven, dat bijvoorbeeld de spatie omzetten naar een streepje wel werkt, dus de functie wordt wel goed aangeroepen. Pas wanneer ik die rare tekens wil omzetten, gaat het niet goed.

Acties:
  • 0 Henk 'm!

Verwijderd

Misschien is het een idee de functie chr() te gebruiken ipv de vreemde tekens in de broncode te zetten.
dus:

http://www.asciitable.com/
$title = str_replace(array(chr(178),chr(147),chr(148),chr(149),char(153)),"o",$title);

Ook kun je htmspecialchars gebruiken om de vreemde tekens eerst om te zetten naar html waardes, om ze daarna te filteren.

$title = htmlspecialchars($title);
$title = str_replace("& ouml;","o",$title); enz...

spatie weglaten bij & ouml;,

[ Voor 20% gewijzigd door Verwijderd op 26-06-2008 08:49 ]


Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
Heb geprobeerd om te doen wat visvogelstar zegt, maar dat werkt helaas ook niet.
Ik krijg dan nogsteeds de gewone entities in mijn output.

Desalniettemin bedankt visvogelstar!
Iemand anders een idee?

Wellicht even een idee om heel mijn functie te plaatsen

PHP:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
function SeoFriendlyUrl($title)
{
    $title = strtolower($title);
    $title = str_replace(" ","-",$title);
    $title = str_replace(array("'","\"","=",")","(","]","[","}","{",",",".","|","?","$","#","@","*","&","%","^","+","~","`"),"",$title);
    $title = str_replace(array("à","á","â","ã","ä","å"),"a",$title);
    $title = str_replace(array("è","é","ê","ë"),"e",$title);
    $title = str_replace(array("ì","í","î","ï"),"i",$title);
    $title = str_replace(array("ð","ò","ó","õ","ö"),"o",$title);
    $title = str_replace(array("ù","ú","û","ü"),"u",$title);
    $title = str_replace("ç","c",$title);
    $title .= ".html";
    
    return $title;
}

[ Voor 63% gewijzigd door Verwijderd op 26-06-2008 08:50 ]


Acties:
  • 0 Henk 'm!

Verwijderd

De functie ziet er goed uit. Weet je wel zeker dat $title die chars ook bevat? Zijn die chars niet perongeluk anders ge-encoded als je ze door de functie heen haalt?

Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
Uit de database haal ik bijvoorbeeld hetvolgende op:

Beâu et Lõëçk

Op de website wordt het dan netjes: beau-et-loeck.html
In de XML (zelfde functie, zelfde encoding als op de website) komt er beâu-et-lõëçk.html uit.

Heel apart, want hij doorloopt dus wel heel de functie, hij voegt er namelijk nog wel .html aan toe. Ook de eerste regel met een array doorloopt ie, wanneer ik namelijk een titel heb met een vraagteken, vervalt die op zowel de site alsin de xml.

Mijn xml begint zo:

PHP:
1
echo "<?xml version=\"1.0\" encoding=\"iso-8859-1\"?>\n";

[ Voor 9% gewijzigd door Verwijderd op 26-06-2008 09:29 ]


Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
Gelukt, door middel van urlencode zet ik eerst de vreemde tekens allemaal om, daarna vorm ik ze pas om tot een normaal leesbare letter. Hieronder de code:

(het is nog niet helemaal kompleet met alle characters, maar dat is nu eenvoudig uit te breiden, voor als iemand de code wil gebruiken)

PHP:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
function SeoFriendlyUrl($title)
{
    
    $title = strtolower($title);
    $title = str_replace(" ","-",$title);
    $title = str_replace(array("'","\"","=",")","(","]","[","}","{",",",".","|","?","!","$","#","@","*","&","%","^","+","~","`"),"",$title);
    $title = urlencode($title);
    $title = str_replace(array("%E0","%E1","%E2","%E3","%E4","%E5"),"a",$title); // à, á, â, ã, ä, å
    $title = str_replace(array("%E8","%E9","%EA","%EB"),"e",$title); // è, é, ê, ë
    $title = str_replace(array("%EC","%ED","%EE","%EF"),"i",$title); // ì, í, î, ï
    $title = str_replace(array("%F0","%F2","%F3","%F5","%F6"),"o",$title); // ð, ò, ó, õ, ö
    $title = str_replace(array("%F9","%FA","%FB","%FC"),"u",$title); // ù, ú, û, ü
    $title = str_replace("%E7","c",$title); // ç
    $title .= ".html";
    
    return $title;
}

Acties:
  • 0 Henk 'm!

  • steffex
  • Registratie: Augustus 2003
  • Laatst online: 12-08 00:24
*kuch....

PHP:
1
$title = htmlentities($title);


ik weet dat deze functie niet alles afvangt, maar wel een heel groot deel!
Daarom toch kandidaat voor dit topic: [Alg] Slechtste programmeervoorbeelden deel 3

PHP:
1
2
3
4
5
6
7
8
9
10
function SeoFriendlyUrl($title)
{
    $title = strtolower($title);
    $title = str_replace(" ","-",$title);
    $title = htmlentities($title);
$title = urlencode($title);
    $title .= ".html";
    
    return $title;
}

[ Voor 113% gewijzigd door steffex op 26-06-2008 13:52 ]


Acties:
  • 0 Henk 'm!

  • MSalters
  • Registratie: Juni 2001
  • Laatst online: 13-09 00:05
De meest makkelijke manier, zonder elk diacriet afzonderlijk te vervangen, is om eerst een Unicode NFD decompositie te doen. Dan krijg je losse diacrieten: ö wordt dan (in geheugen) o" enzovoorts. Vervolgens gooi je dan die diacrieten weg, die zitten in Unicode allemaal bij elkaar (bij U+0300 dacht ik).

Man hopes. Genius creates. Ralph Waldo Emerson
Never worry about theory as long as the machinery does what it's supposed to do. R. A. Heinlein


Acties:
  • 0 Henk 'm!

  • Voutloos
  • Registratie: Januari 2002
  • Niet online
stef-o schreef op donderdag 26 juni 2008 @ 13:42:
ik weet dat deze functie niet alles afvangt, maar wel een heel groot deel!
Daarom toch kandidaat voor dit topic: [Alg] Slechtste programmeervoorbeelden deel 3
En dan mag jouw reactie meteen in het '[Alg] Ik begrijp de requirements niet'-topic. Jouw code levert niet de mooie urls op die de ts wil. ;)

{signature}


Acties:
  • 0 Henk 'm!

  • vorlox
  • Registratie: Juni 2001
  • Laatst online: 02-02-2022

vorlox

I cna ytpe 300 wrods pre miute

Misschien is je database in UTF8
Mocht het MySQL zijn doe dan even
code:
1
mysql_query("SET CHARACTER SET 'Latin1' ");

voordat je de XML aanmaakt.
en probeer het daarna nog eens

Acties:
  • 0 Henk 'm!

  • r0bert
  • Registratie: September 2001
  • Laatst online: 30-07 02:32
Stef-o, wel even het topic lezen in plaats van uit de hoogte te praten.

Zoals vorlox voorstelt
- Je database instellen op de juiste encoding
- Je taellen instellen en converteren voor de juiste encoding
- Je verbinding met mySQL instellen voor de encoding (set names ...; set character set ...;)

Heb je je script zelf (bijv je .php bestand) wel opgeslagen in de juiste codering?

Mogelijk heeft mbstring() invloed op de functie, dan moet je deze dus ook instellen (internal encoding).

Hopelijk helpt het iets.

Acties:
  • 0 Henk 'm!

  • HuHu
  • Registratie: Maart 2005
  • Niet online
Is het geen idee om speciale tekens zoals é of ö sowieso helemaal weg te laten uit al je URLs? Voor SEO doeleinden heeft het geen nut om é of e in een tekst te zetten, want zoekmachines zetten alle speciale tekens toch om naar hun "normale" variant.

Een simpel stukje PHP dat alle speciale tekens omzet naar hun "normale" variant:

PHP:
1
2
3
$txt = "Héllo Çårmëñ, hôw àré yõü?";
$txt = preg_replace('`&(.)(tilde|circ|grave|acute|uml|ring|cedil);`', '$1', htmlentities($txt));
echo($txt);


Dat geeft dus als uitvoer: Hello Carmen, how are you?

Acties:
  • 0 Henk 'm!

  • Icelus
  • Registratie: Januari 2004
  • Niet online
PHP:
1
$s = iconv('ISO-8859-1', 'ASCII//TRANSLIT', $s);

NB.: de locale LC_CTYPE moet ongelijk zijn aan C en POSIX.

Developer Accused Of Unreadable Code Refuses To Comment


Acties:
  • 0 Henk 'm!

  • tech-no-logical
  • Registratie: December 2000
  • Laatst online: 17-09 22:52
ik gebruik :

PHP:
1
2
3
4
5
6
7
8
$string = "Héllo Çårmëñ, hôw àré yõü?";
print $string;
$string = iconv("UTF-8","ASCII//TRANSLIT",$string);
print $string;
$string = preg_replace("/[^A-Za-z\s]/","",$string);
print $string;
$string = preg_replace("/\s/","_",$string);
print $string;


code:
1
2
3
4
Héllo Çårmëñ, hôw àré yõü?
H'ello Carm"e~n, h^ow `ar'e y~o"u?
Hello Carmen how are you
Hello_Carmen_how_are_you


moet met ISO8859-1 (of -15 liever) ook wel werken lijkt me.

edit:
sneller posten :)

[ Voor 3% gewijzigd door tech-no-logical op 26-06-2008 23:15 ]

Pagina: 1