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.
¿Qué pasa cuando alguien ingresa la URL directamente? – akari
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. –
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