[Inquietud] Por que UTF-8 no exporta tildes y iso-8859-1 si

Iniciado por Graphixx, 29 Agosto 2014, 04:37 AM

0 Miembros y 1 Visitante están viendo este tema.

Graphixx

Resulta que cuando exporto una base de datos con UTF8 por defecto quedan mal las tildes y Ñ, encambio con iso-8859-1 si
Pero me parece no recuerdo bien que cuando las importo con UTF8 por defecto si coje las tildes, muy raro no ?
Nada tiene fin solo hay pequeñas pausas, pausas que determinan el comienzo de otros. Graphixx
Mi blog

JorgeEMX

Seguramente lo que hace es pasarte a un equivalente numérico que representa ese carácter. Y si no es eso, entonces estás tratando de exportar una base de datos con otra codificación inicial.

MinusFour

Si la base de datos a la que estas exportando la informacion es ISO-8859 no tiene nada de raro. El archivo sql resultante de la exportacion tiene formato UTF-8?

Graphixx

#3
Esta es la configuracion del hosting:


Esta es la configuracion por defecto de la tabla:


Asi es como se ve por defecto la tabla, fijense que soporta tildes y Ñ:


Ahora si le doy exportar rapido:


Veran como ese tipo de exportacion rapida, no soporta ni tildes ni Ñ:


En cambio si le doy exportacion personalizada:


Vemos como esta con iso-8859-1 si que soporta las tildes y las Ñ:


Tengo la duda, hay algo que falta configurar en las opciones del Servidor?

Si creo las tablas asi, estan bien creadas para tildes y Ñ?
Código (sql) [Seleccionar]

CREATE TABLE usuarios (
  id INT(11) DEFAULT NULL,
  cedula VARCHAR(30) DEFAULT NULL,
  codigo VARCHAR(15) DEFAULT NULL,
  email VARCHAR(200) DEFAULT NULL,
)
ENGINE = INNODB
CHARACTER SET latin1
COLLATE latin1_swedish_ci;

El Character set: esta bien en latin1
El Collate: esta bien en latin1_swedish_ci
Nada tiene fin solo hay pequeñas pausas, pausas que determinan el comienzo de otros. Graphixx
Mi blog

WHK

#4
Eso pasa porque la base de datos está usando latin iso y tu sitio web está procesando utf-8, por lo cual cuando exportas en utf8 se ve mal porque los datos reales están en utf8 pero las tablas las convierte a latin iso, pero cuando exportas a latin iso el phpmyadmin convierte automaticamente los carácteres.

Verifica tu proyecto completo, recuerda que la codificación de carácteres de tu sitio web debe estar definido en:

Las cabeceras enviadas vía php:
<?php header('content-type: text/html; charset=utf-8');

Las cabeceras en el html:
Citar<meta charset="utf-8" />

La conexión mysql:
$mysqli = new mysqli(...);
$mysqli->set_charset('utf8'); // Ojo, sin guión


La entrada de inputs de php:
mb_internal_encoding('utf-8');
mb_http_output('utf-8');
mb_http_input('utf-8');
//mb_language('uni');
mb_regex_encoding('utf-8');


Los formularios en html:
<form accept-charset="utf-8" action="...

Los carácteres en htmlentites:
CitarBien: <b>Letra con acento, &aacute;</b>
Mal: <b>Letra con acento, á</b>

Escribir acentos en código html no es estandard, de hecho si lo validaras como xml te lo rechazaría diciendote que el xml está corrupto, todo carácter especial en xml y html deben escribirse con entidad html. El signo de interrogación abierto es &iquest;, el copyright es &copy; las comillas son &quote;, las eñes son &ntilde; etc etc.

Mira acá donde dice "Html Entity".
http://www.utexas.edu/learn/html/spchar.html

Al momento de crear la base de datos:
CREATE DATABASE `basededatos` CHARACTER SET utf8 COLLATE utf8_general_ci;

Al momento de crear las tablas:
CREATE TABLE tabla( columna text CHARACTER SET utf8 COLLATE utf8_unicode_ci) CHARACTER SET utf8 COLLATE utf8_unicode_ci;

Al momento de abrir tu editor de código asegúrate que sea un editor que esté trabajando bajo tu codificación, por ejemplo eclipse muchas veces te escribe en utf8 a pesar de que el archivo esté en latin iso, debes configurar el proyecto y especificar la codificación, sublimetext y notepad++ mantienen bien la codificación.

Luego de tener todo en regla no volverás a tener mas problemas con los acentos y eñes, de hecho yo trabajo siempre en utf8, no necesito latin iso para manejar los acentos, de hecho visual studio 2012 en adelante  crea proyectos por defecto en utf8 y jamas tiene problemas con los acentos.

Yo en lo personal siguiendo todo esto jamás he tenido problemas de codificación, antes si cuando no sabía y tenia la base de datos en una codificación y los archivos en otra, entonces los acentos se volvían como signos de interrogación y ahí tenía que conseguirme scripts para convertir bases de datos, etc, eso no debería pasar nunca si sigues bien el consejo de las codificaciones.

Ojo, json no soporta múltiples codificaciones, el estandard solo soporta utf8, los caracteres no convencionales se convierten en unicode, si todo tu proyecto usa utf8 entonces no tendrás problemas pero si usas latin iso entonces tendrás problemas al momento de usar datos en json.

A veces puedes decir.. en mi pc funciona bien, los acentos andan bien, pero derrepente viene otra persona y comienza a tener problemas con los acentos, eso es porque no todos los navegadores funcionan con la misma codificación por defecto, si bajas la versión de firefox en español te va a trabajar con latin iso y si bajas la version en ingles te va a usar utf8, pero ojo, no es que siempre lo use, por eso la cabecera de php dice "accept-", es porque acepta esa codificación por defecto y de esa manera haces trabajar a todos los navegadores bajo la misma codificación de caracteres y eso hará que nadie inserte caracteres fuera de tu codificación.

Por último recuerda... antes de hacer cualquier cosa haz respaldos porque puedes corromper tus datos ya existentes si no sabes migrar bien la codificación de una tabla/base de datos existente y te recomiendo usar mysqldump y no phpmyadmin para exportar porque phpmyamdin tiene muchas falencias, depende mucho de php y apache asi que si no tienes bien configurado tu servidor puedes tener problemas como por ejemplo que no te descargue la base de datos completa porque es muy grande y termines con la mitad de la base de datos con un error de php al final o puede que trabaje sin la codificación necesaria. Si instalaste mysql en tu pc deberias tener entonces instalada las herramientas básicas como el comando mysql y mysqldump para hacer respaldos locales y remotos el cual está diseñado para exportar bases de datos sin corromperlas tal cual están en producción.

Dale un vistazo a esto:
http://www.thegeekstuff.com/2008/09/backup-and-restore-mysql-database-using-mysqldump/
http://www.toptal.com/php/a-utf-8-primer-for-php-and-mysql
http://es.wikipedia.org/wiki/UTF-8#Ventajas_y_desventajas
http://www.utexas.edu/learn/html/spchar.html

MinusFour

La tabla no está en UTF-8, está en latin1, que es equivalente a ISO8859-1. Lo que está pasando aqui probablemente es que estas enviando la información en UTF-8 a la tabla latin1. Los datos no están en latin1, sino en UTF-8. Tu navegador debe estar interpretando los strings como UTF-8 por lo que al ver la tabla desde tu navegador, los datos deben aparecer bien.

El archivo resultante probablemente es ISO8859-1 por lo que tu editor de texto interpreta los caracteres UTF-8 en ISO8859-1, lo que lleva a interpretar la codificacion de diferente forma. Por ejemplo: á en UTF-8 usa 2 bytes, (0xC3, 0xA1). 0xC3 en ISO8859-1 es: à y 0xA1 en ISO8859-1 es: ¡, por lo que si lees á codificado en UTF-8 en ISO8859-1 debe producir: á.

Otro ejemplo:

La é:

UTF-8: (0xC3) (0xA9)
ISO8859-1: 0xC3 = Ã
ISO8859-1: 0xA9 = ©
ISO8859-1: (0xC3) (0xA9) = é

ISO8859-1 usa solo un byte para la lectura, mientras que UTF-8 es de longitud variable.

Tu información sigue en UTF-8 si la exportas normalmente es decir no ha sufrido ningun cambio. Con la opcion personalizada debe estar traduciendo UTF-8 a ISO8859-1 por lo que 0xC3, 0xA9 del UTF-8 (á) se vuelve: 0xE1 en ISO8859-1.

Para cambiar de latin1 a utf-8 en tu PHPmyadmin selecionas la tabla y vas al menu de Operaciones (Operations) y cambias el collation ahí. Si realmente no usas caracteres fuera de la codificación ISO8859-1 no uses UTF-8. Realmente no hay mucha diferencia la verdad, pero los acentos y caracteres especiales te ocuparan solo un byte.

JorgeEMX

Cita de: WHK en 29 Agosto 2014, 16:27 PM
La entrada de inputs de php:
mb_internal_encoding('utf-8');
mb_http_output('utf-8');
mb_http_input('utf-8');
//mb_language('uni');
mb_regex_encoding('utf-8');


Jajaja que dato, lo más extremo que he visto :D.

No hay que ser tan radical, con que sus archivos HTML tengan codificación utf8, al igual que su etiqueta meta, y sus archivo PHP, bastaría.