2010-02-10 9 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); 
} 

Zmienia wszystkie znaki UTF-8 do ¾, ¤ i innych śmieci. Czy istnieje inny sposób zachowania znaków UTF-8?Dlaczego DOM zmienia kodowanie?

Nie wysyłaj odpowiedzi mówi mi, aby upewnić się, jestem wyprowadzanie go jako UTF-8, zrobiłem pewien jestem.

góry dzięki :)

+2

Skąd dane ('$ string') pochodzi? –

+0

I zostały zaktualizowane moje pytanie :) –

+0

można podać link do adresu URL, który pobrać za pomocą file_get_contents()? Jak już wspomniałem w drugim pytaniu, podejrzewam, że otrzymujesz ISO-8859-1 lub inne dane, które * mają *, aby zostać zniekształcone, gdy wynik jest w UTF-8. Nie polegałbym na mb_detect_encoding(). –

Odpowiedz

39

miałem podobne problemy niedawno, a ostatecznie znaleźć tego obejścia - Konwersja wszystkich znaków spoza ASCII html jednostkach przed załadunkiem html

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

WOW. Wielkie dzięki, działało idealnie. To już doprowadziło mnie do krawędzi szaleństwa. –

+1

To jest świetne obejście problemu, ale nadal byłoby interesujące dowiedzieć się, dlaczego DOM twojego serwera produkcyjnego najpierw wykrywa UTF8. Może o coś zapytać administratora, jeśli taki istnieje. –

+0

Jestem administratorem: D i nie mam pojęcia. Używam bardzo powszechnej konfiguracji Debiana 5.0 Lenny. Może to "funkcja" bezpieczeństwa, która to robi? –

4

W przypadku jest zdecydowanie DOM przekręcane kodowanie, ten trik zrobił to dla mnie jakiś czas temu na odwrót (przyjmowanie danych ISO-8859-1). DOMDocument powinny być UTF-8 domyślnie w każdym przypadku, ale można jeszcze spróbować:

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

To nie pomogło, ale andrewmabbott rozwiązał już mój problem - sprawdź odpowiedź;) –

+2

Działa tylko z loadXml(), nie z loadHtml(). –

1

na początku skryptu gdzie twoje kłamstwa kod PHP (kod zostanie zaksięgowana tutaj), upewnij się wysłać UTF-8 nagłówek. Założę się, że twoje kodowanie jest teraz pewnym wariantem Latin1. Tak, wiem, że zdalna strona to utf8, ale ten skrypt php nie jest.

0

musiałem dodać nagłówek utf8, aby uzyskać prawidłowy pogląd:

header('Content-Type: text/html; charset=utf-8'); 
Powiązane problemy