Jor*_*ans 16 php xml utf-8 character-encoding
我正在使用PHPUnit来验证PHP代码的XML输出,但显然我遇到了MySQL返回的字符编码问题.这是我从DOMDocument得到的错误:
Input is not proper UTF-8, indicate encoding!
Bytes: 0xE9 0x20 0x42 0x65
Run Code Online (Sandbox Code Playgroud)
我初始化DOMDocument所以它使用正确的编码:
$domDocument = new DOMDocument('1.0','UTF-8');
Run Code Online (Sandbox Code Playgroud)
当我使用mb_detect_encoding检查saveXML()的输出时,结果是UTF-8.
我还检查了用于创建XML的所有调用,在遇到的所有createCDATASection参数上使用mb_detect_encoding,它们都是UTF-8或ASCII(没有纯文本节点,一切都在CDATA块中).
我认为问题来自于使用'é'字符(ISO 8859-1中的 0xE9 ).将该字符添加到我的XML的行是:
$domDocument->createCDATASection($place->name);
Run Code Online (Sandbox Code Playgroud)
和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);
Run Code Online (Sandbox Code Playgroud)
在我的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"
在旁注,是否有任何网站我可以简单地复制粘贴那些十六进制值,看看他们应该在不同的字符集中的字符?
str*_*rry 49
您必须将数据库的连接定义为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);
Run Code Online (Sandbox Code Playgroud)
小智 6
从PHP 5.5.0版本开始,您应该使用
mysqli_set_charset($connection,"utf8");
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
47643 次 |
| 最近记录: |