如何使 MySQL 返回 UTF-8?
2022-08-30 19:31:36
我正在使用PHPUnit来验证PHP代码的XML输出,但显然我在MySQL返回的字符编码方面遇到了问题。这是我从DOMDocument得到的错误:
Input is not proper UTF-8, indicate encoding!
Bytes: 0xE9 0x20 0x42 0x65
我初始化 DOMDocument,以便它使用正确的编码:
$domDocument = new DOMDocument('1.0','UTF-8');
当我使用mb_detect_encoding检查saveXML()的输出时,结果是UTF-8。
我还检查了用于创建XML的所有调用,在遇到的所有createCDATASection参数上使用mb_detect_encoding,它们都是UTF-8或ASCII(没有纯文本节点,所有内容都在CDATA块中)。
我认为问题来自使用“é”字符(在ISO 8859-1中0xE9)。将该字符添加到我的 XML 中的行是:
$domDocument->createCDATASection($place->name);
mb_detect_encoding($place->name)给了我UTF-8。
数据($place->名称)是从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_encode($result['name'])
在监视窗口中再检查一次:
mb_detect_encoding($result['name'])
-> “UTF-8”
mb_detect_encoding(utf8_encode($result['name']))
-> “UTF-8”
顺便说一句,是否有任何网站可以简单地复制粘贴这些十六进制值,并查看它们应该在不同的字符集中的字符?