3

Tengo una página en php que muestra e inserta información desde una base de datos.

Tenía un problema al mostrar las tablas de la base de datos directo en la pagina web pero lo resolví con esto:

mysqli_set_charset($link,"utf8");

Lo puse en el archivo que hace la conexión con la base de datos y ahora me muestra la información bien, con los acentos y todo.

El problema es cuando intento grabar información desde el sitio web a la base de datos. La información se graba sin acentos ni caracteres, en vez de las letras con acento sale .

¿Saben cómo podría resolverlo?

Mi base de datos está en utf8_spanish_ci al igual que los campos a los que deseo insertarles información. Además, si inserto los acentos directamente en la base de datos aparecen sin problema.

OscarGarcia
  • 26,999
  • 3
  • 26
  • 61
Alex Almaran
  • 55
  • 1
  • 6
  • como es la consulta con la que insertas con php?, muestra código php para que te puedan ayudar – Sebastián Lagos Yañez Apr 27 '18 at 02:43
  • ¿Podrías indicarnos las cabeceras HTML que te devuelve el servidor y qué juego de caracteres tienes definido en tu HTML? Si no tienes todo al mismo nivel en algún punto los caracteres serán malinterpretados. – OscarGarcia Apr 27 '18 at 06:50

3 Answers3

2

Para que tu aplicación trabaje a todos los niveles a UTF-8 debes comprobar que:

  • Tu servidor debe devolver la cabecera Content-Type: text/html; charset=utf-8 ya sea generada desde el propio script PHP (con header('Content-type: text/html; charset=utf-8')) o desde el servidor web (AddType o AddCharset en la configuración de apache, por ejemplo).
  • Tu HTML debe tener definido el juego de caracteres usando la etiqueta <meta http-equiv="Content-Type" content="text/html; charset=utf-8"> en compatibilidad con HTML4 y/o <meta charset="utf-8"> usando HTML5.
  • Tus tablas en el servidor MySQL deben (aunque no es necesario) usar el cotejamiento (utf8_spanish_ci).
  • La conexión con el servidor MySQL debe usar codificación UTF-8 usando SET CHARACTER SET utf8 a través de una llamada a mysqli::set_charset() en el caso de usar mysqli.

Estas dos últimas partes son las únicas que parece que has hecho correctamente, de modo que deberás centrarte en arreglar las dos primeras.

Éstas pueden ser complementarias (la definición dentro del HTML suele tener preferencia y la cabecera HTTP suele usarse en ausencia de ella), pero es recomendable usar ambas para que evitar problemas.

Haciendo uso de ambas podría quedar el código como:

<?php
header('Content-type: text/html; charset=utf-8');
/* ... */
?><!doctype html>
<html lang="es">
  <head>
    <meta charset="utf-8">
    <title>Título</title>
  </head>
  <body>
    ...
  </body>
</html>

PD: Faltaría configurar correctamente las locale del sistema, pero eso sería para el uso de funciones de PHP que lo requieran, como strftime().

OscarGarcia
  • 26,999
  • 3
  • 26
  • 61
0

Espero te sirva:

A las variables que recibes por $_POST ponles esto,

Ej:

$nombres = utf8_encode($_POST['nombre']);
$apellidos = utf8_encode($_POST['apellidos']);

Y así con las que tengas.

Alejo Mendoza
  • 683
  • 11
  • 29
0

Asumiendo que el nombre de tu variable se llame conexión, justo después de abrirla basta que indiques el juego de caracteres así

Lo siguiente si usas el driver mysqli

$conexion->set_charset("utf8");

Si por ejemplo usas PDO, basta con que agregues el juego de caracteres de este modo:

$conexion = new PDO("mysql:host=localhost;dbname=database;charset=utf8", $user, $password);

Para que así la variable/objeto (dependiendo si haces la conexión orientada a objetos o procedural) reconozca dicho juego de caracteres