2010-02-10 25 views
20
$string = file_get_contents('http://example.com'); 

if ('UTF-8' === mb_detect_encoding($string)) { 
    $dom = new DOMDocument(); 
    // hack to preserve UTF-8 characters 
    $dom->loadHTML('<?xml encoding="UTF-8">' . $string); 
    $dom->preserveWhiteSpace = false; 
    $dom->encoding = 'UTF-8'; 
    $body = $dom->getElementsByTagName('body'); 
    echo htmlspecialchars($body->item(0)->nodeValue); 
} 

Bu, tüm UTF-8 karakterlerini Å, ¾, ¤ ve diğer çöplere değiştirir. UTF-8 karakterlerini korumak için başka bir yolu var mı?DOM Neden Kodlamayı Değiştiriyor?

Bana UTF-8 olarak çıktıklarıma emin olmam gerektiğini söyleyen yanıtlar göndermeyin, emin olun. peşin

Teşekkür :)

+2

verileri ('$ string') geliyor: –

+0

Sorumu güncelledim :) –

+0

Dosya_get_contents() kullanarak getirdiğiniz URL'ye bir bağlantı sağlayabilir misiniz? Diğer soruda da söylediğim gibi, ISO-8859-1 veya başka bir veri aldığınızdan şüpheleniyorum. Bu, UTF-8'de çıktığında * bozulacak *. Ben mb_detect_encoding() 'ye güvenmeyeceğim. –

cevap

39

ve sonunda bu geçici çözümü buldum - yüklemeden önce varlıkları html olmayan tüm ASCII karakterleri dönüştürmek kodu php yalanların (kod burada yayınlanmıştır), bir utf-8 başlığı gönderir emin olun script üst kısmında html

$string = mb_convert_encoding($string, 'HTML-ENTITIES', "UTF-8"); 
$dom->loadHTML($string); 
+0

WOW. Çok teşekkürler, mükemmel çalıştı. Bu zaten beni çılgınlığın eşiğine getiriyordu. –

+1

Bu harika bir çözümdür, ancak üretim sunucunuzun DOM'sının neden UTF8'i ilk sırada sıkıştırdığını bulmak ilginç olabilir. Belki bir tane varsa yöneticiye sormak için bir şey. –

+0

Yöneticiyim: D ve hiçbir fikrim yok. Debian 5.0 Lenny'nin çok yaygın bir kurulumunu kullanıyorum. Belki de bunu yapan bir güvenlik "özelliği" var mı? –

4

durumda kesinlikle kodlamasını berbat DOM olduğunu bu hüner bir süre önce yuvarlak (ISO-8859-1 veri kabul) Başka yolu benim için yaptı. DOMDocument her durumda varsayılan olarak UTF-8 olmalı ama yine de deneyebilirsiniz: Geçenlerde benzer sorunlar vardı

$dom = new DOMDocument('1.0', 'utf-8'); 
+1

Bu yardımcı olmadı ama andrewmabbott zaten benim sorunu çözdü - onun cevabı kontrol;) –

+2

Sadece loadHml() ile değil, loadXml() ile çalışır. –

1

. Bahse girerim kodlama, şu anda latin1'in bir çeşididir. Evet, uzak web sayfasının utf8 olduğunu biliyorum, ancak bu php betiği değil.

header('Content-Type: text/html; charset=utf-8'); 
0

Doğru bir görünüm elde etmek bir utf8 başlığı eklemek zorunda?
İlgili konular