Caractères spéciaux et réécriture d’URL

Je travaille actuellement sur une application qui extrait les données JSON de l’API de la communauté blizzard et les parsing avec PHP. Tout fonctionne bien jusqu’à ce que je vienne à un personnage avec un caractère spécial en son nom.

Pour extraire les données des personnages, je dois connaître le nom et le domaine de leurs personnages.

J’ai le nom et le domaine transmis via l’URL de la page de caractères, puis à partir de ces informations pour extraire les données de caractère.

À ce stade, mes URL sont comme suit:

http://localhost/guildtree/characters.php?realm=argent-dawn&name=Ankzu 

À ce stade, si j’essaye de récupérer des données pour un personnage avec un accent, je suis redirigé vers ma page d’erreur car ce n’est pas un caractère valide.

Ce n’est que lorsque j’ai commencé la réécriture d’URL que j’ai découvert mon problème. Je suis redirigé vers ma page d’erreur car quelque part sur la ligne, les caractères spéciaux sont remplacés par des personnages vraiment vains.

Avec mes nouvelles URL réécrites, les travaux suivants:

  http://localhost/guildtree/argent-dawn/ankzu 

Cependant, un caractère avec un caractère spécial dans leur nom génère un message d’erreur.

  http://localhost/guildtree/argent-dawn/notúk 

Résultat dans le message d’erreur suivant:

“Pas trouvé

L’URL demandée / guildtree / argent-dawn / notúk n’a pas été trouvée sur ce serveur. ”

Comme vous pouvez le voir, le ú est remplacé par º, mais lorsque je copie et colle l’URL, le ú apparaît sous la forme% C3% BA

Je crois comprendre que la raison pour laquelle le ú apparaît comme ú est que l’unicode ú à deux octets est écrasé en deux caractères ASCII d’un octet, ce qui entraîne l’affichage de ú.

Je me suis assuré que toutes mes pages ont les éléments suivants dans l’en-tête:

  

Pour que mon application fonctionne correctement, j’ai besoin que ces caractères spéciaux s’affichent correctement. J’ai donc besoin de ú pour afficher ú, ne pas apparaître comme ú mais être réellement º ou% C3% BA.

Le nom des caractères est extrait de l’URL simplement en tant que:

 $charName = $_GET['name']; 

Est-il possible d’encoder $ charName pour afficher correctement les caractères spéciaux?

J’ai essayé tout ce que je peux penser et j’ai cherché sur Google, mais rien n’a fonctionné.

En outre, parce que j’utilise la réécriture d’URL, quelle serait la règle de réécriture pour autoriser ces caractères spéciaux?

Voici ma règle de réécriture actuelle:

  RewriteRule ^([a-zA-Z0-9_'-]+)/([a-zA-Z]+)$ characters.php?realm=$1&name=$2 [NC] 

Je suis conscient que ([a-zA-Z] +) ne permet pas du tout les caractères spéciaux, je travaille actuellement sur l’affichage correct des caractères spéciaux. Si j’utilise ([a-zA-Z \ ú] +), cela fonctionnera et affichera la page telle qu’elle doit être affichée. Ajouter le \ ú à la règle semble être une très mauvaise façon de le faire et ne fonctionne pas toujours en utilisant le caractère correspondant pour les caractères accentués.

Toute aide serait grandement appréciée. Si vous avez besoin de plus d’informations, veuillez demander.

Modifier:

En changeant ma règle de réécriture ci-dessous, les informations peuvent être extraites correctement, mais cela crée une boucle de redirection pour mon CSS.

  RewriteRule ^([a-zA-Z0-9_'-]+)/([^/]+)$ characters.php?realm=$1&name=$2 [NC] 

Par exemple, mon CSS est redirigé vers

 http://localhost/guildtree/css/error 

au lieu de

 http://localhost/guildtree/css/style2.css 

Mettre à jour:

A travers quelques tests simples:

 $charName = $_GET['name']; $charNameTEST = utf8_encode($charName); 

Va faire le changement, mais quand j’applique ceci à ma page, ça revient toujours en disant:

“Pas trouvé

L’URL demandée / guildtree / argent-dawn / notúk n’a pas été trouvée sur ce serveur. ”

Je pense que le principal problème concerne maintenant la redirection d’URL, car les données JSON peuvent être analysées parfaitement lorsque les caractères sont accentués. Je ne comprends tout simplement pas pourquoi il continue de me montrer que c’est sur guildtree / argent-dawn / notúk dans la barre de navigation, mais continue d’essayer de tirer / guildtree / argent-dawn / notúk.

ú n’est pas un caractère valide pour une URL.

Où que vous liez le nom d’utilisateur, vous devez le coder par URL.

Par conséquent, l’URL correcte à indiquer est la suivante:

 http://localhost/guildtree/argent-dawn/not%C3%BAk 

Vous devriez l’imprimer en php comme:

 echo 'Link; 

Je pense que cette question pourrait avoir votre réponse. Je ne l’ ai pas essayé moi-même, mais d’après ce que je peux voir, vous devriez réécrire votre RewriteRule comme suit:

 RewriteRule ^([a-zA-Z0-9_'-]+)/([a-zA-Z]+)$ characters.php?realm=$1&name=$2 [NC,B] 

Le drapeau B s’assurera que les caractères spéciaux sont protégés contre les URL, donc la valeur vue par nom dans $ 2 sera encodée en pourcentage. Comme vous ne faites pas de redirection, le caractère Unicode d’origine doit toujours être ce qui est affiché dans l’URL.

Vous aurez également besoin de modifier le regex pour vous assurer qu’il correspond aux caractères Unicode. Je ne suis pas sûr de ce que ce serait.

Il y a aussi une description plus détaillée du fonctionnement des caractères Unicode dans les URL ici .

Pour que cela fonctionne correctement, vous devez faire deux choses.

Tout d’abord, ajoutez ceci à votre fichier .htaccess

 AddDefaultCharset On AddDefaultCharset UTF-8 AddCharset UTF-8 .tpl AddCharset UTF-8 .js AddCharset UTF-8 .css AddCharset UTF-8 .php 

Modifiez ensuite la partie de votre règle de réécriture qui doit autoriser les caractères spéciaux à (. *) Comme suit:

  RewriteRule ^([a-zA-Z0-9_'-]+)/(.*)$ characters.php?realm=$1&name=$2 [NC] 

Cela entraînera des boucles de redirection pour les autres pages, mais je travaille actuellement sur sa correction.