php - programming - stackoverflow surveys
¿Cómo leo una url Unicode con PHP? (5)
Tengo un url unicode: / test.php? SText = Московский
Me gustaría usar la función $ _Get para trabajar con el valor de sText. El código que tengo para test.php es:
<?php
$sVar = $_GET[''sText''];
echo "Variable = $sVar";
?>
El problema es que lo anterior está viniendo bach como: Variable = ??????????
¿Que necesito hacer?
Gracias por todos los comentarios.
He intentado todos los ejemplos, pero aún recibo signos de interrogación, incluso después de guardarlos como utf-8.
¿Hay alguna configuración de php.ini que deba agregar / habilitar para permitir el soporte de Unicode?
Actualmente, para mí de todos modos, el siguiente código:
<html>
<head><meta http-equiv="Content-Type" content="text/html; charset=utf-8" /></head>
<body>
<?php
$sVarControl = "Московский";
$sVar = $_GET[''sText''];
echo "Control = $sVarControl <br />";
echo "Variable = $sVar <br />";
?>
</body>
</html>
Produce el siguiente resultado:
Control = Московский
Variable = ??????????
Entonces la página es capaz de trabajar con y mostrar unicode. ¿Es esto una limitación de la función $ _GET tal vez?
EDITAR
Acabo de intentar ejecutar la página en Google Chrome y está funcionando perfectamente. Esto me lleva a pensar que es una configuración de IE. ¿Pero que? ¿Y cómo lo soluciono?
- Debe devolver un encabezado de tipo de contenido UTF-8 con su
header(''content-type: text/html; charset=utf-8'');
test.phpheader(''content-type: text/html; charset=utf-8'');
- Necesitas guardar tu test.php codificado en UTF-8 (no estoy seguro de esto, pero no dolerá de todos modos)
Finalmente resolví esto, gracias a todos por algunos buenos consejos (consulte el último párrafo de esta publicación para obtener una respuesta rápida).
Estaba haciendo algunas cosas mal que estaba dificultando las cosas.
Noté por primera vez mis problemas de codificación cuando los registros no se escribían en mi base de datos, el db y las tablas estaban todos configurados en utf-8, de modo que dejaba el php.
Para simplificar, creé una página php de prueba para demostrar el problema. Como la página obtenía valores ($ _GET) de la url, cuando cargué mi página de prueba, lo hice con un parámetro Unicode en la url test.php? SText = Московский
El problema para mí, creo, era cómo IE estaba interoperando la url, por alguna razón no podía descifrarlo o reconocerlo como unicode. Esto se hizo evidente cuando lancé la página que falla im Chrome, y funcionó perfectamente.
Procedí a usar la siguiente función para generar la URL completa en Chrome e IE
<?php
function curPageURL() {
$pageURL = ''http'';
if ($_SERVER["HTTPS"] == "on") {$pageURL .= "s";}
$pageURL .= "://";
if ($_SERVER["SERVER_PORT"] != "80") {
$pageURL .= $_SERVER["SERVER_NAME"].":".$_SERVER["SERVER_PORT"].$_SERVER["REQUEST_URI"];
} else {
$pageURL .= $_SERVER["SERVER_NAME"].$_SERVER["REQUEST_URI"];
}
return $pageURL;
}
echo curPageURL();
?>
Internet Explorer 8 hizo eco de lo siguiente:
Sin embargo, Chrome hizo eco de una url codificada:
Como puede ver, Chrome codificaba la url automáticamente, y PHP estaba leyendo y decodificando automáticamente, presumiblemente porque había configurado el tipo de contenido en UTF-8 (gracias Philippe).
Todavía no estaba seguro de por qué IE se comportaba así, pero me empujó en la dirección para codificar la url en la página de llamadas. Estaba llamando a la página en javascript, así que probé la función encodeURIComponent()
. Afortunadamente esto funcionó y ahora estoy obteniendo el mismo resultado en CHROME e IE.
En resumen, si uso encodeURIComponent()
para codificar la url de llamada y me encodeURIComponent()
configurar el tipo de contenido de la página php de destino en el header(''content-type: text/html; charset=utf-8'');
todas las variables url unicode se procesan correctamente.
Gracias, de nuevo, por toda su ayuda. Craig
Intenté usar la función iconv () para resolver su problema (los parámetros de la función pueden variar, dependiendo de la configuración de su sistema):
$get = iconv(''CP1251'', ''UTF-8'', $_GET[''text'']);
echo ''Variable = ''.$get; // Variable = Московский
Puedes leer sobre las funciones iconv . Espero que te sea útil.
Esto funciona bien para mi:
$sVar = $_GET[''sText''];
echo urldecode($sVar);