Неверные кодировки строк - PullRequest
       22

Неверные кодировки строк

1 голос
/ 27 декабря 2010

Примечание: я прочитал все связанные статьи о кодировке символов PHP, UTF-8, которые обычно предлагаются, но мой вопрос касается данных, вставленных до того, как я применил такие методы.Я хочу ретроспективно исправить все проблемы с кодировкой символов.

Теперь все соединения устанавливаются как utf8 с использованием PDO.

PDO::MYSQL_ATTR_INIT_COMMAND => 'SET NAMES utf8'

К сожалению, было вставлено большое количество данных сомнительной кодировкипрежде чем я реализовал правильные практики кодирования символов.Как показано:

$sql = "SELECT name FROM data LIMIT 3";

foreach ($pdo->query($sql) as $row)
{
    $name = $row['name'];

    echo $name . "\n";
    echo utf8_encode($name) . "\n";
    echo utf8_decode($name) . "\n";
    echo htmlspecialchars($name, ENT_QUOTES, 'UTF-8') . "\n";
    echo htmlspecialchars(utf8_encode($name), ENT_QUOTES, 'UTF-8') . "\n";
    echo htmlspecialchars(utf8_decode($name), ENT_QUOTES, 'UTF-8') . "\n";
    echo '<hr/>';
}

, который выдает:

Antonín Dvořák
AntonÃÆín DvoÃâ¦Ãâ¢ÃÆák
Anton�?­n Dvo�?�?�?¡k
Antonín Dvořák
AntonÃÆín DvoÃâ¦Ãâ¢ÃÆák

----------
Ô±Ö€Õ¡Õ´ Ô½Õ¡Õ¹Õ¡Õ¿Ö€ÕµÕ¡Õ¶
ñÃâ¬Ã¡Ã´ ýáùáÿÃâ¬ÃµÃ¡Ã¶
Ա�?ամ Խաչատ�?յան
Ô±Ö€Õ¡Õ´ Ô½Õ¡Õ¹Õ¡Õ¿Ö€ÕµÕ¡Õ¶
ñÃâ¬Ã¡Ã´ ýáùáÿÃâ¬ÃµÃ¡Ã¶

----------
Tiësto
Tiësto
Tiësto
Tiësto
Tiësto
Tiësto
----------

При удалении «SET NAMES utf8» с помощью PDO он создает данные, которые на самом деле содержат правильные элементы, хотя и на разныхlines:

Antonín DvoÅák
Antonín DvoÃÂák
Antonín Dvořák
Antonín DvoÅák
Antonín DvoÃÂák
Antonín Dvořák
----------
Արամ Խաչատրյան
Ô±ÖÕ¡Õ´ Ô½Õ¡Õ¹Õ¡Õ¿ÖÕµÕ¡Õ¶
???? ?????????
Արամ Խաչատրյան
Ô±ÖÕ¡Õ´ Ô½Õ¡Õ¹Õ¡Õ¿ÖÕµÕ¡Õ¶
???? ?????????
----------
Tiësto
Tiësto
Ti�sto
Tiësto
Tiësto

----------

А вот дамп соответствующих строк базы данных:

DROP TABLE IF EXISTS `data`;
CREATE TABLE IF NOT EXISTS `data` (
  `id` int(10) unsigned NOT NULL AUTO_INCREMENT,
  `name` varchar(80) NOT NULL,
  PRIMARY KEY (`id`),
  KEY `name` (`name`(10)),
) ENGINE=InnoDB  DEFAULT CHARSET=utf8 AUTO_INCREMENT=0;

INSERT INTO `data` (`id`, `name`) VALUES (0, 'Antonín Dvořák'), (1, 'Արամ Խաչատրյան'), (2, 'Tiësto');

3-я и 6-я строки 3-го ряда "Tiësto" затем корректно отображаются.Я просто не уверен, каков наилучший способ исправить кодировки / обнаружить кодировки плохих строк и исправить их и т. Д.

Ответы [ 2 ]

1 голос
/ 27 декабря 2010

Один способ, которым должен работать - я сам не пробовал - это выгрузить базу данных в файл, используя phpMyAdmin, импортировать ее и , указав latin1 в качестве кодировки хотя это кодировка UTF-8. (Вам нужна версия phpMyAdmin, которая предлагает указывать набор символов файла дампа в раскрывающемся меню при импорте).

Это должно превратить ë обратно в ë. Если данные постоянно повреждены (то есть это не сочетание действительных символов UTF-8 и сломанных), это может сработать.

Очевидно, сделайте резервные копии, прежде чем пытаться это сделать, и потом просматривайте данные тонкой расческой.

0 голосов
/ 27 декабря 2010

Довольно необычное решение, которое я нашел и после тестирования, похоже, работает:

Соединение A = Соединение UTF8 Соединение B = старое соединение не-UTF8, которое кодировало исходные данные

  • С A я возвращаю «имя», которое отображается правильно с B, но повреждено с A из-за кодировки DB не-UTF8
  • Найдите идентификатор предмета в B, просмотрев искаженное значение A
  • Затем с использованием обновленной БД с правильно закодированным значением UTF8

Довольно запутанный, но, похоже, работает. Обновит, если возникнут проблемы.

...