2

Tengo una situación con los caracteres especiales del español como lo son los acentos y las eñes, pues sucede lo siguiente: Desde HTML tengo mi charset UTF8 en la etiqueta meta

Desde mi Base de datos uso utf8_unicode_ci tanto para la tabla como para la columna (cotejamiento que siempre uso y que nunca me ha dado problemas)

Desde el .htaccess aplique el

AddDefaultCharset utf-8

Desde PHP también aplique el

header('Content-Type: text/html; charset=utf-8');

Además cuando hago una consulta también estoy aplicando set_charset('utf_8')

y por último puse un

default_charset = utf_8 

desde el .ini de php

El proyecto en mi PC no tiene estos problemas, pero cuando lo cargue en el servidor cpanel me salió el famoso error del rombo con el signo de interrogación. Realmente he intentado resolverlo pero no se me ocurre más nada. Ya intenté aplicar el utf8_encode y funciona, pero quisiera ver si hay otras alternativas ya que esta solución tomaría cierto tiempo y por lo tanto la veo un poco tediosa.

Para finalizar, lo extraño es que el texto que no viene de la base de datos (El texto estático de HTML) que usa estos caracteres, se ven bien, los que presentan problemas son solo los que vienen de la base de datos. No se donde puede estar el problema, si desde MySQL o desde PHP.

Gracias de antemano a los que aporten sus ideas. De verdad muchas gracias por su tiempo.

Riaven
  • 3,379
  • 5
  • 14
  • 31
dorinix
  • 168
  • 10
  • 1
    Una opción es al conectar con la base de datos de mysql pasar el tipo de codificación junto con los datos de usuario, password, etc, por ejemplo si usas mysqli: function($dbuser='', $dbpassword='', $dbname='', $dbhost='localhost', $encoding=''). – Carmen Jul 18 '19 at 06:30
  • Existe una respuesta muy completa que resuelve casi todos (me atrevería decir que todos) los problemas con la codificación de los datos: https://es.stackoverflow.com/questions/59489/por-que-el-car%c3%a1cter-inspector-aparece-en-algunos-datos-obtenidos-de-la-base – phpMyGuel Jul 18 '19 at 07:14
  • 2
    Posible duplicado de [¿Por que el Carácter inspector (�) aparece en algunos datos obtenidos de la Base de Datos?](https://es.stackoverflow.com/questions/59489/por-que-el-car%c3%a1cter-inspector-aparece-en-algunos-datos-obtenidos-de-la-base) – Marcos Jul 18 '19 at 11:57
  • Gracias a todos por su comentario, pero que va, no doy con la solución aun. El enlace que me pasaron esta muy bueno, pero el problema persiste, casualmente comentaba en una de las respuestas que en la base de datos el registro esta bien con su acento o con su eñe, pero algo curioso es que cuando modifico uno de estos registros con rombos desde la aplicación el caracter del acento se cambia por caracteres como "Ä" y asi. – dorinix Jul 18 '19 at 13:34

2 Answers2

2

Una buena práctica es setear que charset utilizará tu conexión de MySQL una vez establecida la conexión. No importando si usas MySQi o PDO_MYSQL (recuerda que mysql_connect está obsoleta desde php5.5), siempre ejecuta la siguiente query inmediatamente después de conectarte:

SET NAMES 'UTF8'

En paralelo, existe la definición explícita del conector, en el caso de MySQLi es $mysqli->set_charset("utf8");.

En cuanto al uso de las funciones utf8_encode o utf8_decode, debes tener claridad de como y cuando las estás usando, ya que sin saber podrías estar codificando caracteres ya codificados. En un script con charset correctamente definido, los resultados a los siguientes ejemplos son:

<?php
echo '1. El Ñandú comía feliz';
echo utf8_encode('2. El Ñandú comía feliz');
echo utf8_decode('3. El Ñandú comía feliz');
echo utf8_encode(utf8_encode('4. El Ñandú comía feliz'));
?>

y los resultados serían:

introducir la descripción de la imagen aquí

Respecto al charset por el lado de PHP/HTML, si bien la recomendación es que la definición de charset se haga en los headers, siempre es bueno incluirlo dentro del mismo código para descartar cualquier falla en la configuración, como lo podría ser una negación de la directiva "AllowOverride" en apache para el archivo ".htaccess".

En HTML 5

<meta charset=UTF-8>

Antes de HTML 5

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

Siempre pueden ser mas factores de los que uno menciona, cuéntanos como te va.

https://httpd.apache.org/docs/2.4/es/howto/htaccess.html

Benjamin
  • 234
  • 1
  • 8
  • Antes que nada, gracias por tu colaboración, pues, he intentado varias cosas de las que me han comentado pero aun nada, algo interesante es que en la base de datos el registro esta bien con su acento o con su eñe, pero curioso es que cuando modifico uno de estos registros con rombos desde la aplicación el caracter del acento se cambia por caracteres muy parecidos al cuarto ejemplo del utf8_encode. Me parece muy curioso eso. – dorinix Jul 18 '19 at 13:29
  • 1
    Al final me has dado la pista para resolver el problema. Ha sido con este documento, a pesar de que tenia set_charset en utf8 no era suficiente, tuve que aplicar esta función https://www.php.net/manual/es/mysqli.set-charset.php desde el mismo constructor. Gracias por todo – dorinix Jul 18 '19 at 13:48
0

Para que los acentos se guarden bien en la base de datos, debes colocar

$acentos = mysqli_query($conection,"SET NAMES 'utf8'");

antes de ejecutar la query por ejemplo:

$conection = Conection::getConection();

$acentos = mysqli_query($conection,"SET NAMES 'utf8'");
if($colegio!='Nuevo'){
    if (empty($certificadodoc)){
        $nombredocumento="";
    }
    $query="UPDATE colegios SET FechaInicio='$fecha', Nombre='$nombre', FechaFin='$fechafin',Certificado='$nombredocumento'
            WHERE Id=$colegio";
    $result = mysqli_query($conection, $query);
}

Copiado y pegado de un script mio , espero te sirva

KeTeMeTo
  • 1,026
  • 5
  • 19