entre Desarrolladores

Recibe ayuda de expertos

Registrate y pregunta

Es gratis y fácil

Recibe respuestas

Respuestas, votos y comentarios

Vota y selecciona respuestas

Recibe puntos, vota y da la solución

Pregunta

3votos

Definir codificación de caracteres javascript+php

Hola.
No logro definir el charset correspondiente en mi formulario php+js+html!!

En el head html agrego una línea:

<meta content="text/html; charset=UTF-8" http-equiv="content-type"> 

También he intentado agregando charset al llamar al script:

<script src="ajax.js" charset="UTF-8"></script>

Pero sigue el error:
(imagen que no carga removida)

2 Respuestas

1voto

top21tk Puntos2090

La solución la encontré agregando:

mysql_query("SET NAMES utf8");

antes de la consulta sql.

Es decir, defino que la consulta devuelva caracteres UTF-8

Todo el merito a Leonardo-Tadei

2votos

Leonardo-Tadei Puntos227010

Hola Nico,

lo que te está pasando es que el script PHP que es llamado vía AJAX no está devolviendo los caracteres en UTF-8.

Tené en cuenta que la llamada vía AJAX es completaemnte independiente del CHARSET definido en el llamador; dicho en otras palabras, son dos script PHP independientes uno de otro.

En tu caso, al estar devolviendo un select HTML no tenés como poner cabeceras indicando que el charset es UTF-8 (a diferencia de si devolvieras una página HTML completa o un XML, y el default del servidor web que usás debe estar devolviendo un juego de caracteres diferente.

Lo podés solucionar agregando al script que es llamado vía AJAX las siguientes líneas de código al principio:

<?php
mb_http_output( "UTF-8" );
header( "Content-Type: text/html; charset=".mb_http_output());
..

con esto el script generará una cabecera HTTP con el juego de caracteres UTF-8 siempre y cuando este charset sea soportado por el servidor.

Saludos!

0voto

Leonardo-Tadei comentado

Hola Nico,

acá te dejo el código funcionando: http://leonardo.tadei.com.ar/nico/

Lo podés descargar de: http://leonardo.tadei.com.ar/nico/nico.zip por unos días.

En resumen: hay que usar el mismo juego de catracteres en todas partes. Lo que verás agregado es que los caracteres se convierten a UTF-87 de ser necesario, y luego se pasan por htmlentities para convertirlos a caractares codificados HTML, y aque una página UTF-8 nunca mostrará bien caracteres almacenados en Latin1 (ISO8859-1)

<?php
mb_http_output( "UTF-8" );
header( "Content-Type: text/html; charset=".mb_http_output());
include 'conexion.php';
$q=1;
if(isset($_POST['q'])) {
    $q=$_POST['q'];
}
$con=conexion();
$sql = "select materias.id, materias.nombre from materias where idplan=$q";
$res=mysql_query($sql,$con);

echo "<select name=materia>";
while($fila=mysql_fetch_array($res)){
    if (mb_detect_encoding($fila["nombre"]) != "UTF-8") {
        $fila["nombre"] = mb_convert_encoding($fila["nombre"],"UTF-8");
   }
   $fila["nombre"] = htmlentities($fila["nombre"]);
    echo "<option value=".$fila['id'].">".$fila['nombre']."</option>"; 
}
echo "</select><br><input type=submit></form>";
?>

A veces los manejadores de MySQL te juegan una mala pasada, porque usan su codificación para manipular los datos, y el sitio web puede usar una distinta. Acá nos ha pasado que hasta que no agregamos datos con nuestra propia aplicación, lo que escribíamos a mano en PHPMyAdmin u otros siempre se veía mal.

Verás también que hay corregidos algunos detalles: si ponés tu PHP a trabajar en modo estricto para que reporte todos los errores, advertencias y noticias, verás que hay cosas que pulir en tu código original.

Por último, usá campos VARCHJAR o CHAR en las tablas cuando el texto no requiera más de una línea. Los campos TEXT son muy ineficientes para hacer búsquedas. También tenés que hacer que coincidan el campo id_plan de la tabla Materias con el tipo del id de la tabla Planes: las relaciones funcionan mucho mejor si todo es del mismo tipo.

Saludos cordiales!

0voto

top21tk comentado

Veo que tu ejemplo funciona perfecto

Los archivos que descargué, luego de configurar biebn la conección, no dan resultado.
Es decir, sólo muestra el primer option, como si no pudiera capturar los datos de la tabla.
Revisé todo el código de nuevo y no encontré nada mal.
Evidentemente es otro el problema.
Igualmente gracias por tu tiempo, dejaré en stand by la solución por un tiempo, no te preocupes por buscar más, debe ser algo que no funciona en mi servidor.

Debo atender otras cosas ahora, cuando compruebe mis errores, marco tu respuesta.

Gracias nuevamente...

0voto

Leonardo-Tadei comentado

Pero qué misterio, Nico,
Al no poder acceder a tu código funcionando, no podremos avanzar más por este camino.
Ya nos contarás como sigue esto y qué era lo que pasó.
Saludos!

0voto

top21tk comentado

Hola Leo, Subí el ejemplo original y funciona.
Está en blog21/ajx
Evidentemente es un problema de mi servidor. Ya veremos...
Muy productivos tus aportes.
Muchas gracias


Responde en una nueva respuesta con el link a codigo jerry para marcarlo como respuesta.


0voto

Leonardo-Tadei comentado

Bueno, es un alivio!

Por favor, accede o regístrate para responder a esta pregunta.

Otras Preguntas y Respuestas


...

Bienvenido a entre Desarrolladores, donde puedes realizar preguntas y recibir respuestas de otros miembros de la comunidad.

Conecta