0

Estoy consultando una base de datos la cuál en alguna de sus tablas tiene valores con caracteres especiales, por ejemplo palabras de ciudades como: Bogotá, Medellín, etc...

Esto es lo que tengo hasta ahora:

  • Mi base de datos tiene cotejamiento utf8_spanish_ci
  • cuándo hago la conexión a mi base de datos la hago así:
$conn_str = "mysql:host={$this->db_host};port={$this->db_port};dbname={$this->db_name};charset=utf8" 

$conn = new PDO($conn_str, $this->db_user, $this->db_pass, array(PDO::ATTR_PERSISTENT => true));

(estoy usando PDO).

  • mi html tiene codifiación utf-8.

Sinceramente no se que mas intentar.

Esta es una imágen de la pestaña Network del navegador de la respuesta que obtengo de la consulta:

introducir la descripción de la imagen aquí

Y esta es una imagen para que vean las cabeceras de la respuesta que dice utf-8:

introducir la descripción de la imagen aquí

Que puede estar sucediendo aquí? sinceramente ya no se que mas intentar, también intente añadir esta línea AddDefaultCharset UTF-8 en el httpd.conf de apache y tampoco funcionó. alguien que sepa como puedo solucionar este problema? lo calificaría como positivo si pudiera ayudarme. Gracias de antemano.

NOTA:

Uso XAMPP, este así tengo mi archivo httpd.conf:

AddDefaultCharset UTF-8
# This is the main Apache HTTP server configuration file.  It contains the
# configuration directives that give the server its instructions.
# See <URL:http://httpd.apache.org/docs/2.4/> for detailed information.
# In particular, see 
# <URL:http://httpd.apache.org/docs/2.4/mod/directives.html>
# for a discussion of each configuration directive.
#
# Do NOT simply read the instructions in here without understanding
# what they do.  They're here only as hints or reminders.  If you are unsure
# consult the online docs. You have been warned.  
#
# Configuration and logfile names: If the filenames you specify for many
# of the server's control files begin with "/" (or "drive:/" for Win32), the
# server will use that explicit path.  If the filenames do *not* begin
# with "/", the value of ServerRoot is prepended -- so "logs/access_log"
# with ServerRoot set to "/usr/local/apache2" will be interpreted by the
# server as "/usr/local/apache2/logs/access_log", whereas "/logs/access_log" 
# will be interpreted as '/logs/access_log'.
#
# NOTE: Where filenames are specified, you must use forward slashes
# instead of backslashes (e.g., "c:/apache" instead of "c:\apache").
# If a drive letter is omitted, the drive on which httpd.exe is located
# will be used by default.  It is recommended that you always supply
# an explicit drive letter in absolute paths to avoid confusion.

#
# ServerRoot: The top of the directory tree under which the server's
# configuration, error, and log files are kept.
#
# Do not add a slash at the end of the directory path.  If you point
# ServerRoot at a non-local disk, be sure to specify a local disk on the
# Mutex directive, if file-based mutexes are used.  If you wish to share the
# same ServerRoot for multiple httpd daemons, you will need to change at
# least PidFile.
#
Define SRVROOT "C:/xampp/apache"

imagen de muestra:

el field 'Nombré' lo agregué para que vean que si se muestra el acento (pero esto es un valor local), mientras que en el field 'Ciudad' donde tiene el valor 'Bogotá' ese el que valor que viene de la Base de datos.

imagen:

introducir la descripción de la imagen aquí

JulianProg
  • 1,039
  • 15
  • 37
  • ¿Responde esto a tu pregunta? [¿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) – BetaM Jan 14 '20 at 04:33
  • Bueno... Tendría que empezar de nuevo, pero si lees mi pregunta y esas respuestas creo que casi todo lo mencionado allí (por no decir todo) ya lo intenté. – JulianProg Jan 14 '20 at 04:50
  • Solo por descartar... ¿Has utilizado alguna herramienta de BBDD para consultar si tus datos se han almacenado con la codificación correcta? Lanza la consulta con MySQL Workbench por ejemplo. – lk2_89 Jan 14 '20 at 08:09
  • Voy a probar eso que comentas a ver que pasa. – JulianProg Jan 14 '20 at 09:15
  • @lk2_89 descargué el MySQL Workbench pero me da un error al instalar en windows, no se que pasa y mi internet es un asco para descargar. La consulta la hago desde PhpMyAdmin y me devuelve la palabra 'Bogotá' sin problemas. – JulianProg Jan 14 '20 at 12:50
  • @JulianProg bueno, al menos vamos descartando cosas. ¿Cómo tienes configurado el `DefaultCharset` de Apache? – lk2_89 Jan 14 '20 at 12:55
  • Acabo de editar mi pregunta, uso XAMPP y ahí mostré mi archivo httpd.conf para que lo veas. – JulianProg Jan 14 '20 at 13:10
  • Acabo de editar mi pregunta, uso XAMPP y ahí mostré mi archivo httpd.conf para que lo veas. – JulianProg Jan 14 '20 at 13:10
  • Desde tu consulta, por ejemplo, deberías con php recibir usando la función utf8_encode las variables de tu consulta para poder mostrar un resultado con acentos – Fernando Torres Jan 14 '20 at 13:18
  • Me puedes mostrar por favor la parte de tu consulta a la base de datos y el código php que ocupas para retornar ese objeto a javascript? – Fernando Torres Jan 14 '20 at 13:19
  • @FernandoTorres subí el codigo php a mi pregunta. Sinceramente no se nada de php, soy mas de front, esto es un código al que le estoy haciendo mantenimiento y debo resolver ese problema de los caracteres especiales. ando viendo como funciona todo. – JulianProg Jan 14 '20 at 13:38
  • ni agregando directamente los caracteres de esta forma á en la base de datos me los muestra bien. Esto es increíble pués. – JulianProg Jan 14 '20 at 17:02
  • Hola Julián, te propongo empezar por una prueba sencilla. En el mismo contexto donde muestras los datos de la base de datos, coloca a mano una palabra escrita con acentos y dinos si se muestra bien o no. – A. Cedano Jan 14 '20 at 20:06
  • @A.Cedano Si amigo, si se muestra, el problema es con el dato que me viene de la base de datos. Subí una imagen a mi pregunta para que veas. Agregué el field 'Nombré' que tiene acento, pero si vez el valor de field Ciudad, está escrito con los caracteres malos, ese valor, Bogotá, viene de la Base de datos. – JulianProg Jan 15 '20 at 00:05
  • @A.Cedano me leí tu respuesta en el tema que me dejaron arriba, hice todos los pasos y nada me funcionó, no se que mas intentar, tengo 2 días en esto. – JulianProg Jan 15 '20 at 00:18
  • Ejecuta un `SHOW CREATE TABLE NOMBRE-DE-LA-TABLA;` poniendo el nombre real de la tabla. Copia y pega el resultado en la pregunta para ver cuál es la configuración de la tabla. – A. Cedano Jan 15 '20 at 15:24

3 Answers3

1

Puedes usar mb_convert_encoding antes de pasar el valor a pantalla.

$variableSalida=mb_convert_encoding($variableEntrada,"Latin1","auto");
$echo $variableSalida; 

debes tener habilitada la extensión correspondiente en tu php.ini

;extension=php_ldap.dll
extension=php_mbstring.dll
;extension=php_exif.dll      ; Must be after mbstring as it depends on it
rpaillao
  • 1,290
  • 2
  • 7
  • 19
0

Te comento como lo solucione, hay varias formas de corregir aquello la primera es que el archivo que visualizas los datos tenga extensión php y no htm o html. Una vez seguro que sea extension php lo abres con algún editor por ejemplo notepad++ y te aseguras de guardarlo como utf-8 no me refiero a que pongas un tag utf-8 sino el encoding del archivo php si usas Eclipse o similar en propiedades del archivo te da esa opción, de esta forma si tienes en la tabla Bogot~ aparecera Bogotá. Si no puedes usar un archivo con extensión php prueba hacer lo mismo con el archivo html o sea cambiando el encoding a utf-8 y guardalo con ese encoding. Otra opción cuando estes complicado y con falta de tiempo es utilizar en php el comando echo utf8_decode($pais); que hace algo similar convierte esos caracteres raros a caracteres entendibles.

Rene
  • 83
  • 5
  • el problema es que hago la consulta en php, y luego esos datos los muestro en una vista con javascript. El codigo ya esta hecho y se usa un framework llamado sencha touch que es medio feo. – JulianProg Jan 14 '20 at 15:13
0

Buen día Julián, intenta esto a la salida de la consulta:

    $listaBienes[$contador]->setCadenaFabricante($registro['FABRICANTE']);
    $listaBienes[$contador]->setCadenaMarca(utf8_encode($registro['MARCA']));
    $listaBienes[$contador]->setCadenaModelo(utf8_encode($registro['MODELO']));
    $listaBienes[$contador]->setCadenaMaterial(utf8_encode($registro['MATERIAL']));
    $listaBienes[$contador]->setCadenaColor(utf8_encode($registro['COLOR']));

Encapsula el dato de salida, no requieres modificar nada del Xammp o del Mysql con este parámetro "utf8_encode()"

Del lado del HTML en el meta: <meta charset="UTF-8">

Espero te sea de utilidad.

Saludos

Cesarin
  • 673
  • 3
  • 11