2011-06-03 9 views
13

benim PHP kodundan XML çıktısını doğrulamak için PHPUnit kullanıyorum, ancak görünüşe göre ben karakter kodlaması MySQL döner ile ilgili sorunlar var. Doğru kodlamayı kullanır böylecenasıl MySQL dönüş UTF-8 yapabilirim?

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

Ben DOMDocument başlatmak:

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

Ve kullanarak) (SaveXML çıktı kontrol ederken sonuca mb_detect_encoding UTF-8 İşte ben DOMDocument aldığım hatadır .

Ayrıca tüm createCDATASection parametrelerinde mb_detect_encoding kullanarak, XML oluşturmak için kullanılan tüm çağrıları da kontrol ettim ve bunların hepsi UTF-8 veya ASCII (düz metin düğümleri yok, her şey CDATA blokundadır).

Ben sorun (ISO 8859-1 yılında 0xE9 olan) bir 'é' karakteri kullanımı geliyor düşünüyorum. Benim XML o karakter ekler çizgidir:

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

ve mb_detect_encoding ($ yer-> isim) bana UTF-8 verir.

verileri ($ yer-> isim) MySQL veritabanından çekilir. Bu veritabanı UTF-8 karakter kümesine sahiptir. İşte

bazı örnek kod şudur: Benim PhpStorm ayıklayıcıya olarak

$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); 

, veritabanından getirilen dize şöyle görünür:

Caf Belga

Yani bence Bu sorunun köküdür. MySQLWorkbench'de dize doğrudur: Café Belga.

utf8_encode($result['name'])'u kullanırken, her şey iyi çalışıyor!

saatler penceresindeki Bir daha çek:

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

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

, vardır orada herhangi siteleri nerede Bu onaltılık değerleri kopyalayıp yapıştırabilir ve farklı karakter kümelerinde hangi karakterlerin olması gerektiğini görebilir miyim?

+0

kullanmalıdır 5.5.0? Bir dosyada mı? Kodunda mı? – Yeroon

+0

Üzgünüz, bu söylemeyi unutmuşum, Sorumu düzenlendi: veri mysql veritabanından çekilir. Bu veritabanı utf8 karakter kümesine sahiptir. –

+0

@Joris Eğer DOMDocument oluşturduktan sonra herhangi bir noktada LoadXml kullanıyorsunuz? Ayrıca, sorunu gösteren, bizim için tekrarlanabilir bir test çantası sağlayabilir misiniz? – Gordon

cevap

42

Sen UTF-8 gibi veritabanına bağlantıyı tanımlamak zorunda: sürüm PHP itibaren

// 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); 
+0

Teşekkürler! Bu çözüldü! –

+0

Sevindim :-) Yardımcı olabilir – strauberry

+0

"SET NAMES" kullanmamalısınız (bkz. Http://stackoverflow.com/questions/5288953/is-mysql-real-escape-string-broken/5289141#5289141). – Gumbo

0

'é' karakteri saklanır nerede

mysqli_set_charset($connection,"utf8");