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

Điều này thay đổi tất cả các ký tự UTF-8 thành Å, ¾, ¤ và các rác khác. Có cách nào khác để bảo vệ các ký tự UTF-8 không?Tại sao DOM thay đổi mã hóa?

Không đăng câu trả lời cho tôi biết để đảm bảo rằng tôi xuất ra dưới dạng UTF-8, tôi đã đảm bảo rằng tôi đang có.

Cảm ơn trước :)

+2

đâu dữ liệu ('$ chuỗi') đến từ đâu? –

+0

Tôi đã cập nhật câu hỏi của mình :) –

+0

Bạn có thể cung cấp liên kết tới URL bạn tìm nạp bằng cách sử dụng file_get_contents() không? Như tôi đã nói trong câu hỏi khác, tôi nghi ngờ bạn đang nhận được ISO-8859-1 hoặc một số dữ liệu khác, trong đó * có * bị cắt xén khi xuất trong UTF-8. Tôi sẽ không dựa vào mb_detect_encoding(). –

Trả lời

39

Tôi đã có vấn đề tương tự gần đây, và cuối cùng tìm thấy cách giải quyết này - chuyển đổi tất cả các ký tự khác ASCII để html đơn vị trước khi tải html

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

WOW. Cảm ơn rất nhiều, đã làm việc một cách hoàn hảo. Điều này đã khiến tôi đến bờ vực điên rồ. –

+1

Đây là một giải pháp tuyệt vời nhưng vẫn sẽ rất thú vị để tìm hiểu lý do tại sao máy chủ sản xuất DOM của bạn vít lên UTF8 ngay từ đầu. Có thể một cái gì đó để hỏi quản trị viên, nếu có một. –

+0

Tôi là quản trị viên: D và tôi không có ý tưởng. Tôi đang sử dụng một thiết lập rất phổ biến của Debian 5.0 Lenny. Có lẽ đó là một số "tính năng" bảo mật thực hiện điều này? –

4

Trong trường hợp nó chắc chắn là DOM Screwing lập mã hóa, thủ thuật này đã làm nó cho tôi một thời gian trở lại theo chiều ngược lại (chấp nhận dữ liệu theo tiêu chuẩn ISO-8859-1). DOMDocument nên được UTF-8 theo mặc định trong mọi trường hợp, nhưng bạn vẫn có thể thử:

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

Điều này đã không giúp đỡ nhưng andrewmabbott đã giải quyết vấn đề của tôi rồi - kiểm tra câu trả lời của mình;) –

+2

Nó hoạt động chỉ với loadXml(), không phải với loadHtml(). –

1

Ở đầu tập lệnh nơi mã php của bạn nằm (mã bạn đăng tại đây), đảm bảo bạn gửi tiêu đề utf-8. Tôi đặt cược mã hóa của bạn là một số biến thể của latin1 ngay bây giờ. Có, tôi biết trang web từ xa là utf8, nhưng tập lệnh php này không có.

0

tôi đã có thêm một tiêu đề utf8 để có được cái nhìn đúng đắn:

header('Content-Type: text/html; charset=utf-8'); 
Các vấn đề liên quan