Php 如何使MySQL返回UTF-8?

Php 如何使MySQL返回UTF-8?,php,xml,utf-8,character-encoding,Php,Xml,Utf 8,Character Encoding,我使用PHPUnit来验证PHP代码中的XML输出,但显然我在字符编码返回方面存在问题。以下是我从DOMDocument中得到的错误: Input is not proper UTF-8, indicate encoding! Bytes: 0xE9 0x20 0x42 0x65 我初始化DOMDocument,使其使用正确的编码: $domDocument = new DOMDocument('1.0','UTF-8'); 当我使用mb_detect_编码检查saveXML()的输出时,结

我使用PHPUnit来验证PHP代码中的XML输出,但显然我在字符编码返回方面存在问题。以下是我从DOMDocument中得到的错误:

Input is not proper UTF-8, indicate encoding!
Bytes: 0xE9 0x20 0x42 0x65
我初始化DOMDocument,使其使用正确的编码:

$domDocument = new DOMDocument('1.0','UTF-8');
当我使用mb_detect_编码检查saveXML()的输出时,结果是

我还检查了用于创建XML的所有调用,在遇到的所有CreateCataSection参数上使用mb\u detect\u编码,它们都是UTF-8或ASCII(没有纯文本节点,所有内容都是块)

我认为这个问题源于使用了一个“é”字符(在中是0xE9)。将该字符添加到我的XML的行是:

$domDocument->createCDATASection($place->name);
mb_detect_编码($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调试器中,从数据库获取的字符串如下所示:

咖啡馆� 贝尔加

所以我认为这是问题的根源。在MySQLWorkbench中,字符串是正确的:CaféBelga

但是,当使用
utf8\u encode($result['name'])
时,一切正常

在“手表”窗口中再检查一次:

mb\u检测编码($result['name'])
->“UTF-8”

mb\u检测编码(utf8\u编码($result['name']))
->“UTF-8”


另一方面,是否有任何站点可以简单地复制粘贴这些十六进制值,并查看它们在不同的字符集中应该是什么字符?

您必须将与数据库的连接定义为:


从PHP5.5.0版开始,您应该使用

mysqli_set_charset($connection,"utf8");

“é”字符存储在哪里?在文件中?在你的代码中?哦,忘了提到这一点,我编辑了我的问题:数据来自mysql数据库。此数据库具有utf8字符集。@Joris您在创建domdocument后的任何时候都使用loadXml吗?另外,您能为我们提供一个可复制的测试用例来说明这个问题吗?不使用loadXml No。我将尝试制作一个测试用例,添加
mysql\u set\u字符集('utf-8')。您不应该使用
设置名称
(请参阅)。谢谢您的提示,Gubmo!不知道这一点,并以面向对象的方式,即:$connection->set_charset(“utf8mb4”);
mysqli_set_charset($connection,"utf8");