Dal post pubblicato nel blog TSW sulle URL SEF e i caratteri speciali, è nata una discussione che mi ha fatto pensare ad un'estensione che tale strumento dovrebbe avere per definirsi completo.
Nel caso presentato parlavo della non corretta applicazione della funzione nel caso delle lingua tedesca dove i caratteri con la dieresi non sono correttamente codificati nel passaggio da titolo a URL.
Questa però ha un difetto: non si comporta in maniera corretta nella gestione dei caratteri tedeschi, in particolare i caratteri con la dieresi come ö, ë, ü. Questi caratteri, infatti, vengono tradotti con una regola errata:
ä = a
ö = o
ü = u
al posto di
ä = ae
ö = oe
ü = ue
Durante la discussione
Johnnie, invece, fa notare che in spagnolo la “g” la “u” viene pronunciata, ad esempio “güigüe” è diverso da “guigue”.
In questo caso il problema si risolve traducendo il carattere “ü” con la sua relativa transcodifica “%C3%BC” in modo tale che essa venga poi visualizzato correttamente ed evidenziato nelle SERP.
La soluzione migliore, quindi, per costruire un modello più completo è quello di:
- parametrizzare la funzione remove_accents($string) aggiungendo un nuovo parametro $language;
- eseguire l'assegnamento dell'array double_chars, in base alle esigenze.
Nel caso del tedesco sarà:
$double_chars['in'] = array(chr(140), chr(156), chr(198), chr(208), chr(222), chr(223), chr(230), chr(240), chr(254), chr(196), chr(220), chr(214), chr(228), chr(252), chr(246));
$double_chars['out'] = array('OE', 'oe', 'AE', 'DH', 'TH', 'ss', 'ae', 'dh', 'th', 'Ae', 'Ue', 'Oe', 'ae', 'ue', 'oe');
nel caso sollevato da Johnnie sullo spagnolo sarà:
$double_chars['in'] = array(chr(140), chr(156), chr(198), chr(208), chr(222), chr(223), chr(230), chr(240), chr(254), chr(196), chr(220), chr(214), chr(228), chr(252), chr(246));
$double_chars['out'] = array('OE', 'oe', 'AE', 'DH', 'TH', 'ss', 'ae', 'dh', 'th', 'Ae', 'Ue', 'Oe', 'ae', '%C3%BC', 'oe');
Come giustamente ricordava Alessandro Chinazzo, inoltre, è utile utilizzare questo codice php, come modello per generarni analoghi, scritti in altri linguaggi.
Vi segnalo inoltre un altro
tip della funzione remove_accents per velocizzarne l'esecuzione:
//add this to remove_accents as a first line
if ( !preg_match('/[\x80-\xff]/', $titolo) ) return $titolo;
...Che bello che è il mondo open source! :-)