2010-01-26 39 views
22
<tag> 
Алекс М 
</tag> 

Khi tôi cố gắng để có được nội dung của đoạn mã sau sử dụng chức năng DOMDocument, nó sẽ trả về một cái gì đó như:PHP mã hóa với DOMDocument

ÐÐ»ÐµÐºÑ Ðœ 

Tôi đã cố gắng thiết lập mã hóa DOMDocument để giá trị khác nhau (UTF- 8, ISO-8859-1), sử dụng mb_convert_encoding, iconv và utf8_encode nhưng không thành công.

Làm thế nào tôi có thể nhận được "Алекс М" thay vì "ÐÐ" еÐÑ Ðœ "?

CHỈNH SỬA: Dữ liệu nhập đến từ trang được tải bằng curl. Khi tôi xuất nội dung trang vào trình duyệt của mình, các ký tự được hiển thị chính xác (vì vậy tôi nghi ngờ đầu vào là vấn đề).

+0

Bạn có thể đăng mã bạn đang sử dụng để tạo tài liệu và quan trọng nội dung vào đó không? –

Trả lời

42

Hãy thử:

$string = file_get_contents('your-xml-file.xml'); 
$string = mb_convert_encoding($string, 'utf-8', mb_detect_encoding($string)); 
// if you have not escaped entities use 
$string = mb_convert_encoding($string, 'html-entities', 'utf-8'); 
$doc = new DOMDocument(); 
$doc->loadXML($string); 
+0

Tôi gặp vấn đề này với một dấu đơn giản và câu trả lời này dường như đã giải quyết được vấn đề. Cần lưu ý rằng nếu bạn sử dụng các thực thể html trên chuỗi, thì bạn sẽ không thể thực hiện loadXML, vì XML sẽ phàn nàn về các thực thể không xác định; bạn sẽ phải sử dụng loadHTML. Tuy nhiên, tôi nghi ngờ có một chức năng mà sẽ chuyển đổi chúng thành các thực thể như « hoặc bất cứ điều gì. Rắc rối là, đây không thực sự là một câu trả lời hay bởi vì nó làm cho văn bản không thể đọc được, nhưng PHP là một chút khét tiếng cho các vấn đề mã hóa. – Altreus

+1

Câu trả lời này vừa cứu ngày của tôi, cảm ơn bạn. – Maerlyn

+0

Tôi muốn lưu ý rằng bạn có thể thêm dòng này vào cuối khi bạn nhận được kết quả HTML: '$ html = mb_convert_encoding ($ html, 'utf-8', 'thực thể html'); ' Chuyển đổi nào một số thực thể html trở lại giá trị ban đầu của chúng. –

6

Thêm tiêu đề xml cho bạn thẻ - thử điều này:

$a = new DOMDocument(); 
$a->loadXml ('<?xml version="1.0" encoding="UTF-8"?><tag>Алекс М</tag>'); 
print htmlspecialchars ($a->saveXml()); 
19

Tôi đã có một vấn đề tương tự sau khi sử dụng XPath để phân tích DomDocument, và sau khi đọc này

https://bugs.php.net/bug.php?id=32547

Tôi đã giải quyết nó như thế này

// Workaround because PHP 5.2.x has encoding problems, when we 
// update to PHP 5.3 this line is not necesserry any more 
$content = '<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />' . $content; 

// Creating new DOM document and loading HTML content 
$dom_document = new DOMDocument('1.0', 'UTF-8'); 
$dom_document->substituteEntities = TRUE; 
$dom_document->loadHTML($content); 
+2

Cảm ơn bạn đã đăng bài này. Tôi đang duy trì một máy chủ kế thừa chạy PHP 5.2.6 và đã có vấn đề chính xác này. Điều này giải quyết nó. –