2010-10-11 4 views
2

Pour une application Web, nous devons créer un lien vers un contenu généré par l'utilisateur. Un utilisateur tape un titre, par exemple. un produit et nous générons une URL SEO friendly pour ce produit:comment prendre en charge les URL UTF8 (japonais, arabe, espagnol, ...) en PHP

comme celui-ci

title: a nice product 

www.user.com/product/a-nice-product 

title: أبجد هوز 

www.user.com/product/أبجد هوز 

Le problème est que ces URL langues étrangères ne sont pas pris en charge de et un navigateur refuse d'ouvrir ces liens. J'ai vu des configurations de wordpress soutenir ce genre d'URL donc je suppose que c'est possible de faire ceci.

Est-ce que quelqu'un sait comment nous devrions soutenir cela en php?

wikipedia gère ce très bien: http://ar.wikipedia.org

+0

Depends sur ce que vous entendez par "très bien". Dans mon IE8, l'URL après le dernier '/' s'affiche en% D8% A7% D9% 84% D8% B5% D9% 81% D8% AD% D8% A9_% D8% A7% D9% 84% D8% B1 % D8% A6% D9% 8A% D8% B3% D9% 8A% D8% A9. –

Répondre

6

Bien que l'URL lui-même permet que des caractères US-ASCII, vous pouvez use Unicode characters in the URI path si vous les encoder avec UTF-8, puis les convertir en caractères US-ASCII en utilisant le percent-encoding:

Un système qui interne fournit des identifiants sous la forme d'un codage de caractères différent, tel que EBCDIC, effectuera généralement la traduction de caractères d'identificateurs textuels en UTF-8 [STD63] (ou un autre surensemble du codage de caractères US-ASCII) à une interface interne, fournissant ainsi identificateurs plus significatifs que ceux résultant simplement du codage en pourcentage des octets d'origine.

Ainsi, vous pouvez faire quelque chose comme ceci (en supposant UTF-8):

$title = 'أبجد هوز'; 
$path = '/product/'.rawurlencode($title); 
echo $path; // "/product/%D8%A3%D8%A8%D8%AC%D8%AF%20%D9%87%D9%88%D8%B2" 

Bien que le chemin URI est en fait codé avec le pour cent de codage, la plupart des navigateurs modernes affiche les caractères de cette séquence représente en Unicode lorsque UTF-8 est utilisé.

+0

cela semble intéressant, mais n'est-ce pas mieux pour, par exemple,/product/españa pour faire ce/product/espana au lieu de/product/espa% F1a? – Jorre

+0

great stuff mate, merci pour votre aide déjà! – Jorre

+0

Je suis sûr que vous vérifiez ces URL pour copier-coller-capacité et signet-capacité. Dans mon expérience, ils fonctionnent souvent bien lorsque vous les servez dans le navigateur en tant que balise d'ancrage ou URL de redirection, mais une fois que le navigateur a stocké et récupéré l'URL, tous les paris sont désactivés. J'espère que vous trouverez une solution et bonne chance! – BjornS

0

Vous pourriez avoir besoin d'utiliser le codage IDNA sur la partie non-ASCII de l'URL.

http://en.wikipedia.org/wiki/Internationalized_domain_name

+1

IDNA est seulement pour le nom de domaine réel. Le reste de l'URL est encodé en utilisant le codage en pourcentage ('urlencode()' en PHP). – TRiG

+0

pouvons-nous utiliser urlencode() pour encoder tous les caractères non ascii? – Jorre

1

Vous n'êtes plus je crains que des ennuis. L'encodage de l'URL est à la discrétion du navigateur. J'ai rencontré le même problème en essayant de supporter des URLs avec des caractères spéciaux norvégiens et c'est simplement pas toujours possible.

Vous pouvez rediriger un navigateur vers l'URL UTF-8, mais il peut vous répondre en ISO. Cela devient encore pire dans certains cas où les navigateurs (firefox par exemple) vont mélanger la mise en forme ISO et UTF-8 dans la même URL (cela arrive surtout avec les paramètres get).

Ma suggestion est simplement; Ne le faites pas, utilisez soit l'anglais (mieux SEO aussi!) Ou épeler phonétiquement.

+0

pour moi ce n'est pas un problème, mais les clients de mon application web sont internationaux et utiliseront des titres dans leur propre langue. – Jorre

+0

vérifier http://ar.wikipedia.org, ils traitent cela très bien donc je dois être possible? – Jorre

+0

@Jorre ils l'ont de la même manière urlencoded laid. C'est le navigateur qui le rend joli. Mieux la translittérer –

0

Vous devriez faire urlencode le texte arabe ou unicode

urlencode('كلام-عربي') 

Et il est très important d'ajouter le code charset à l'étiquette de tête de la page, sinon le lien ne fonctionne pas

<meta charset="utf-8"> 
Questions connexes