Ошибка в кодировке mysql -> Как я могу преобразовать его в другое? - PullRequest
5 голосов
/ 10 мая 2011

Некоторое время назад я запустил сайт, используя неправильный CHARSET в моей БД и сайте. HTML был установлен на ISO ... и DB на латиницу ..., страница была сохранена на западном латинском языке ... большой беспорядок.

Сайт на французском языке, поэтому я создал функцию, которая заменила все акценты, такие как "é" на "é". Который решил проблему временно.

Я только что узнал намного больше о программировании, и теперь мои файлы сохраняются как Unicode UTF-8, HTML-код находится в UTF-8, а мои столбцы таблицы MySQL установлены в ut8_encoding ...

Я попытался переместить акценты назад к «é» вместо «é», но у меня возникают обычные проблемы с кодировкой (?) Или странными символами «Ã ¢» как в MySQL, так и когда страница отображается.

Мне нужно найти способ обновить мой sql через функцию, которая очищает строки, чтобы он наконец мог вернуться к нормальной жизни. На данный момент моя функция выглядит так, но не работает:

function stripAcc3($value){

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

    return strtr($value, $ent);
}

Любая помощь приветствуется. Заранее спасибо. Если вам нужен код, пожалуйста, сообщите мне, какая часть.

UPDATE

Если вам нужны баллы, мне нужны подробные инструкции о том, как это сделать. Благодаря.

Ответы [ 6 ]

5 голосов
/ 15 мая 2011

Попробуйте использовать следующую функцию вместо этого, она должна решить все проблемы, которые вы описали:

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;
}

Что касается конкретных инструкций по использованию, я предлагаю следующее:

  1. экспорт вашей старой латиноамериканской базы данных (надеюсь, что она у вас есть) в виде дампа SQL / CSV *
  2. используйте вышеуказанную функцию для содержимого файла и сохраните результат в другом файле
  3. импортировать файл, созданный на предыдущем шаге, в схему / базу данных с поддержкой UTF-8

* Пример:

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

Это должно сделать это, если не даст мне знать.

2 голосов
/ 13 мая 2011

Возможно, вы захотите изучить, что используется для исправления проблем с кодировкой базы данных WP:

http://codex.wordpress.org/Converting_Database_Character_Sets

Короче говоря, большинство старых сайтов WP были созданы на шведском / Latin1сопоставленные таблицы, которые использовались для хранения строк UTF8.Чтобы правильно сопоставить таблицы, подход состоит в том, чтобы изменить столбец на двоичный тип, а затем изменить его на текст UTF8.

Это позволяет избежать искажения текста при непосредственном преобразовании из Latin1 в UTF8.

0 голосов
/ 19 мая 2011

Если вы хотите обсудить со своей базой данных в UTF-8, вы должны сообщить базе данных, что поток соединения является потоком UTF-8. Вы должны отправлять запрос перед каждым запросом в базу данных, этот запрос в следующем:

"SET NAMES utf8";

Personnaly Я использую это в файлах connect.inc.php, которые создают соединение с базой данных. Какое это утверждение базы данных знает, что ваша отправка UTF-8 закодирована строка и отлично работает!

Функция mysql_set_charset не работает, я пробовал эту функцию в прошлом, но правда в том, что она не работает.

Для вашей полной проблемы, если вы хотите преобразовать строку latin1 в UTF-8, вы должны сначала преобразовать строку latin1 в двоичный формат строки. Затем преобразуйте двоичную строку в строку UTF-8, все это можно сделать внутри базы данных с помощью команд базы данных. Посмотри на эту статью (на французском): http://www.noidea.ca/2009/06/15/comment-convertir-une-db-de-latin1-a-utf8/

Я могу вам сказать, что этот метод работает, потому что я использовал его для преобразования данных из базы данных, которую я создал.

0 голосов
/ 19 мая 2011

Убедитесь, что не только ваши таблицы используют utf-8, ваше соединение с базой данных также должно использовать utf-8.

$this->db = mysql_connect(MYSQL_SERVER,DB_LOGIN,DB_PASS);
mysql_set_charset  ('utf8',$this->getConnection());
0 голосов
/ 15 мая 2011

Я не совсем уверен, что понимаю ваш вопрос, но если у вас есть

  • база данных UTF-8

  • все специальные символытам хранятся в виде HTML-сущностей

, а затем

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

должен сделать трюк и превратить все сущности обратно в их родной UTF-8символы.

0 голосов
/ 10 мая 2011

Вам нужно будет преобразовать ошибочные строки, используя, например, iconv .Вам предстоит узнать, какие строки уже UTF-8, а какие латинские-1.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...