2012-08-24 19 views
7

Actualmente estoy trabajando en una aplicación que extrae datos JSON de la API de la comunidad Blizzard y los analiza con PHP. Todo funciona bien hasta que encuentro un personaje con un personaje especial en su nombre.Reescritura de caracteres especiales y URL

Para obtener los datos de los personajes, necesito saber el nombre de sus personajes y el reino en el que se encuentran.

Tengo el nombre y el dominio que se pasan a través de la URL a la página del personaje, y desde allí el uso de esa información para extraer los datos del personaje.

En este punto mis URL son así:

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

En este punto, si trato de extraer datos de un personaje con un acento que ser re-dirigido a mi página de error porque no es válido personaje.

No fue hasta que comencé la reescritura de URL que descubrí mi problema. Estoy siendo redirigido a mi página de error porque en algún lugar de la línea los caracteres especiales están siendo sustituidos por algunos personajes realmente inseguros.

con mi nuevo URL reescrito el seguimiento funciona:

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

Sin embargo, un personaje con un carácter especial en sus resultados de nombre en un mensaje de error.

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

Los resultados en el siguiente mensaje de error:

"No se ha encontrado

La URL solicitada no se encontró/guildtree/Argent-amanecer/notúk en este servidor"

Como se puede ver la U está siendo sustituido por äº, pero cuando puedo copiar y pegar la URL del ú aparece como% C3% BA

Es mi entender que la razón por la U está apareciendo como äº es porque el unicode ú de dos bytes se está comprimiendo en dos caracteres ASCII de un byte, lo que da como resultado que se muestre el ú.

me he asegurado de que todas mis páginas tienen el siguiente en la cabecera:

<meta http-equiv="Content-Type" content="text/html; charset=utf-8" /> 

Para que mi aplicación para que funcione correctamente Necesito esos caracteres especiales para mostrar correctamente, así que necesito la U Visualizar realidad como ú, no aparece como ú pero en realidad es ú o% C3% BA.

El nombre de caracteres está siendo promocionado de URL simplemente como:

$charName = $_GET['name']; 

¿Es posible codificar $ charname para mostrar los caracteres especiales correctamente?

He intentado todo lo que puedo pensar y he buscado en Google, pero nada ha funcionado.

Además, debido a que estoy utilizando la reescritura de URL, ¿cuál sería la regla de reescritura para permitir estos caracteres especiales?

Aquí está mi actual regla de reescritura:

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

Soy consciente de que ([a-zA-Z] +) no permite en absoluto para caracteres especiales, que actualmente han estado trabajando en conseguir el caracteres especiales para mostrar correctamente. Si uso ([a-zA-Z \ ú] +), funcionará y mostrará la página tal como debe mostrarse. Agregar el \ ú a la regla parece ser una forma muy pobre de hacerlo y no siempre funciona al usar el caracter correspondiente para los caracteres acentuados.

Cualquier ayuda sería muy apreciada. Si necesita más información, pregunte.

Editar:

Cambiar mi regla de reescritura para el siguiente permite que la información se tiró bien, pero crea un bucle de redireccionamiento para mi CSS.

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

Por ejemplo, mi CSS se redirige a

http://localhost/guildtree/css/error 

en lugar de

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

Actualización:

A través de algunas pruebas simples:

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

hará que el cambio, pero cuando aplico esto a mi página todavía aparece diciendo:

"No se ha encontrado

La URL solicitada no se encontró/guildtree/Argent-amanecer/notúk en este servidor "

Creo que el problema principal ahora es con la redirección de URL, porque los datos JSON se pueden analizar perfectamente bien cuando tiene los caracteres acentuados. Simplemente no entiendo por qué me sigue mostrando que está en guildtree/argent-dawn/notúk en la barra del navegador, pero sigue intentando tirar/guildtree/argent-dawn/notük.

Respuesta

3

ú no es un carácter válido para una URL.

Dondequiera que vincule el nombre de usuario, debe codificarlo en la URL.

ahí la URL correcta para que apunte a es:

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

debería imprimir en PHP como:

echo '<a href="http://localhost/guildtree/argent-dawn/'. urlencode($name) .'">Link</a>; 
+0

¿Qué pasa cuando alguien ingresa la URL directamente? – akari

+0

Quizás también desee considerar ASCIIfying the usernames. 'example.com/guildtree/argent-dawn/notuk /' en lugar de 'example.com/guildtree/argent-dawn/not% C3% BAk'. Sus usuarios probablemente lo encuentren más fácil. –

+0

example.com/guildtree/argent-dawn/notuk y example.com/guildtree/argent-dawn/notúk extraerían dos conjuntos de datos completamente diferentes, sin embargo, el nombre del personaje debe ser exacto. – akari

2

creo this question podría tener su respuesta. Tengo no trataron esto mismo, pero por lo que puedo ver, que había necesidad de reescribir su RewriteRule como:

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

El B bandera se asegurará de que los caracteres especiales son URL escapó, por lo que la el valor visto por nombre en $ 2 sería el porcentaje codificado. Como no está haciendo una redirección, el carácter original de Unicode debería ser lo que se muestra en la URL.

También necesitará algunos cambios en la expresión regular para garantizar que coincida con los caracteres Unicode. No estoy seguro de cuáles serían.

También hay algo más de descripción de cómo unicode characters work in URLs over here.

+0

Ataron eso, pero está creando un error interno del servidor. Editar: tenía un error tipográfico, no hay error interno ahora, pero aún no funciona. – akari

2

Para que esto funcione correctamente, debe hacer dos cosas.

En primer lugar agregar esto a su .htaccess

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

cambiar segundo lugar la parte de la regla de reescritura que necesita para permitir que los caracteres especiales al igual que (*.):

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

Esta voluntad causa algunos bucles de redireccionamiento para otras páginas, pero estoy trabajando para solucionarlo en este momento.