Error al codificar mysql -> ¿Cómo puedo reconvertirlo a otra cosa?

Comencé un sitio web hace algún tiempo usando el CHARSET incorrecto en mi base de datos y en mi sitio. El HTML se configuró en ISO ... y el DB en latín ..., la página se guardó en latín occidental ... un gran lío.

El sitio está en francés, así que creé una función que reemplazó todos los acentos como "é" a "é". Lo que resolvió el problema temporalmente.

Acabo de aprender mucho más sobre programación, y ahora mis archivos se guardan como Unicode UTF-8, el HTML está en UTF-8 y las columnas de mi tabla MySQL están configuradas en ut8_encoding ...

Traté de retroceder los acentos a "é" en lugar de "é", pero obtengo los problemas habituales con el juego de caracteres (?) o caracteres extraños" Ã ¢ "tanto en MySQL como cuando se muestra la página.

Necesito encontrar una manera de actualizar mi sql, a través de una función que limpie las cadenas para que finalmente pueda volver a la normalidad. Por el momento, mi función se ve así pero no funciona:

function stripAcc3($value){

 $ent =   array(
          'à'=>'à', 
          'â'=>'â', 
            'ù'=>'ù', 
          'û'=>'û',
            'é'=>'é', 
          'è'=>'è', 
          'ê'=>'ê', 
            'ç'=>'ç', 
            'Ç'=>'Ç', 
            "î"=>'î', 
            "Ï"=>'ï', 
            "ö"=>'ö', 
            "ô"=>'ô', 
            "ë"=>'ë', 
            "ü"=>'ü', 
            "Ä"=>'ä',
            "€"=>'€',
          "′"=> "'",
          "é"=> "é"
        );

    return strtr($value, $ent);
}

Cualquier ayuda bienvenida. Gracias por adelantado. Si necesita un código, dígame qué parte.

ACTUALIZACIÓN

Si quieres los puntos de recompensa, necesito instrucciones detalladas sobre cómo hacerlo. Gracias.

preguntado el 10 de mayo de 11 a las 13:05

+1 por querer reemplazar el arreglo de entidades temporales por una solución adecuada. -

6 Respuestas

Intente usar la siguiente función en su lugar, debería manejar todos los problemas que describió:

function makeStringUTF8($data)
{
    if (is_string($data) === true)
    {
        // has html entities?
        if (strpos($data, '&') !== false)
        {
            // if so, revert back to normal
            $data = html_entity_decode($data, ENT_QUOTES, 'UTF-8');
        }

        // make sure it's UTF-8
        if (function_exists('iconv') === true)
        {
            return @iconv('UTF-8', 'UTF-8//IGNORE', $data);
        }

        else if (function_exists('mb_convert_encoding') === true)
        {
            return mb_convert_encoding($data, 'UTF-8', 'UTF-8');
        }

        return utf8_encode(utf8_decode($data));
    }

    else if (is_array($data) === true)
    {
        $result = array();

        foreach ($data as $key => $value)
        {
            $result[makeStringUTF8($key)] = makeStringUTF8($value);
        }

        return $result;
    }

    return $data;
}

Con respecto a las instrucciones específicas de cómo usar esto, sugiero lo siguiente:

  1. exporta el contenido de tu antigua base de datos latina (espero que todavía la tengas) como un volcado SQL / CSV *
  2. use la función anterior en el contenido del archivo y guarde el resultado en otro archivo
  3. importar el archivo que generó en el paso anterior en el esquema / base de datos compatible con UTF-8

* Ejemplo:

file_put_contents('utf8.sql', makeStringUTF8(file_get_contents('latin.sql')));

Esto debería hacerlo, si no me lo hace saber.

contestado el 15 de mayo de 11 a las 13:05

Es posible que desee investigar qué se utiliza para solucionar problemas de codificación de la base de datos WP:

http://codex.wordpress.org/Converting_Database_Character_Sets

Para resumir, la mayoría de los sitios WP antiguos se crearon con tablas clasificadas en sueco / latín1, que se utilizaron para almacenar cadenas UTF8. Para clasificar las tablas correctamente, el enfoque es cambiar la columna a tipo binario y luego cambiarla a texto UTF8.

Esto evita que el texto se modifique al convertir de Latin1 a UTF8 directamente.

contestado el 13 de mayo de 11 a las 18:05

Deberá convertir las filas ofensivas usando, por ejemplo, iconv. El desafío para ti será saber qué filas ya son UTF-8 y cuáles son latin-1.

contestado el 10 de mayo de 11 a las 17:05

Gracias. ¿Existe una función de PHP que pueda darme el conjunto de caracteres actual de una cadena? - denisléxico

No, ese es tu problema. Sin embargo, puede adivinar intentándolo y si iconv () devuelve FALSE, asuma que no es latin-1. Esto no es del todo correcto, porque no diferencia entre "no latin-1" o "no apropiado latin-1", por ejemplo, si sus documentos originales latin-1 contienen caracteres ilegales para latin-1 para empezar. - miel

No estoy completamente seguro de entender su pregunta, pero si tiene

  • una base de datos UTF-8

  • todos los caracteres especiales allí almacenados como entidades HTML

Entonces un

html_entity_decode($string, ENT_QUOTES, "UTF-8");

debemos haga el truco y convierta todas las entidades en sus caracteres nativos UTF-8.

contestado el 15 de mayo de 11 a las 13:05

Asegúrese de que no solo sus tablas usen utf-8, su conexión de base de datos también debe usar utf-8.

$this->db = mysql_connect(MYSQL_SERVER,DB_LOGIN,DB_PASS);
mysql_set_charset  ('utf8',$this->getConnection());

contestado el 19 de mayo de 11 a las 01:05

Si desea discutir con su base de datos en UTF-8, debe decirle a la base de datos que el flujo de conexión es un flujo UTF-8. Tienes que enviar una solicitud antes de cada solicitud que realices a la base de datos, esta solicitud de la siguiente manera:

"ESTABLECER NOMBRES utf8";

Personalmente, lo uso en los archivos connect.inc.php que crean la conexión a la base de datos. ¡Que esta declaración la base de datos sabe que su envío de cadena codificada en UTF-8 y funciona perfectamente!

La función mysql_set_charset no funciona bien, probé esta función en el pasado, pero la verdad es que no funciona.

Para su problema completo, si desea convertir la cadena latin1 a UTF-8, primero debe convertir la cadena latin1 a un formato de cadena binaria. Luego convierta la cadena binaria en cadena UTF-8, todo se puede hacer dentro de la base de datos con los comandos de la base de datos. Ver que artile (en francés): http://www.noidea.ca/2009/06/15/comment-convertir-une-db-de-latin1-a-utf8/

Puedo decirte que este método funciona porque lo usé para transformar datos de una base de datos que he creado.

contestado el 19 de mayo de 11 a las 14:05

No es la respuesta que estás buscando? Examinar otras preguntas etiquetadas or haz tu propia pregunta.