Как я могу заставить MySQL возвращать UTF-8? - PullRequest
15 голосов
/ 03 июня 2011

Я использую PHPUnit для проверки вывода XML из моего PHP-кода, но, очевидно, у меня проблемы с кодировкой символов MySQL .Вот ошибка, которую я получаю из DOMDocument:

Input is not proper UTF-8, indicate encoding!
Bytes: 0xE9 0x20 0x42 0x65

Я инициализирую DOMDocument, чтобы он использовал правильную кодировку:

$domDocument = new DOMDocument('1.0','UTF-8');

И когда я проверяю вывод из saveXML (), используя mb_detect_encodingрезультат UTF-8 .

Я также проверил все вызовы, использованные для создания XML, используя mb_detect_encoding для всех найденных параметров createCDATASection, и все они являются либо UTF-8, либо ASCII (тамнет текстовых узлов, все находится в CDATA блоках).

Я думаю, что проблема связана с использованием символа 'é' (который равен 0xE9 в ISO 8859-1 ).Строка, которая добавляет этот символ в мой XML:

$domDocument->createCDATASection($place->name);

и mb_detect_encoding ($ place-> name) дает мне UTF-8.

Данные ($ place-> name)извлекается из базы данных MySQL.В этой базе данных есть кодировка UTF-8.

Вот пример кода:

$query = sprintf('SELECT name FROM place where id = 1');
$result = mysql_query($query);
$result = mysql_fetch_assoc($result);


// -- Feeding UTF-8 data directly WORKS
$domDocument = new DOMDocument('1.0','UTF-8');
$rootNode = $domDocument->createElement('Response');
$rootNode->appendChild($domDocument->createCDATASection('Café Belga'));
$domDocument->appendChild($rootNode);

$matcher = array('tag' => 'Response');
self::assertTag($matcher, $domDocument->saveXML(), '', FALSE);

// -- Feeding UTF-8 data from the resultset FAILS
$domDocument = new DOMDocument('1.0','UTF-8');
$rootNode = $domDocument->createElement('Response');
$rootNode->appendChild($domDocument->createCDATASection($result['name']));
$domDocument->appendChild($rootNode);

$matcher = array('tag' => 'Response');
self::assertTag($matcher, $domDocument->saveXML(), '', FALSE);

В моем отладчике PHPStorm строка, извлеченная из базы данных, выглядит следующим образом:

Caf� Belga

Так что я думаю, что это корень проблемы.В MySQLWorkbench правильная строка: Café Belga.

При использовании utf8_encode($result['name']), однако, все работает отлично!

Еще одна проверка в окне часов:

mb_detect_encoding($result['name']) -> "UTF-8"

mb_detect_encoding(utf8_encode($result['name'])) -> "UTF-8"

В добавлении, есть ли сайты, где я могу просто скопировать и вставить эти шестнадцатеричные значения ипосмотреть, какими символами они должны быть в разных наборах символов?

Ответы [ 2 ]

48 голосов
/ 03 июня 2011

Вы должны определить соединение с вашей базой данных как UTF-8 :

// Set up your connection
$connection = mysql_connect('localhost', 'user', 'pw');
mysql_select_db('yourdb', $connection);
mysql_query("SET NAMES 'utf8'", $connection);

// Now you get UTF-8 encoded stuff
$query = sprintf('SELECT name FROM place where id = 1');
$result = mysql_query($query, $connection);
$result = mysql_fetch_assoc($result);
4 голосов
/ 11 сентября 2017

Начиная с версии PHP 5.5.0, вы должны использовать

mysqli_set_charset($connection,"utf8");
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...