Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

PHP encoding with DOMDocument

Tags:

<tag> Алекс М </tag> 

When I try to get the content of the following code using DOMDocument functions, it returns something like:

ÐÐ»ÐµÐºÑ Ðœ 

I've tried setting DOMDocument encoding to different values (UTF-8, ISO-8859-1), using mb_convert_encoding, iconv and utf8_encode but without success.

How can I get "Алекс М" instead of "ÐÐ»ÐµÐºÑ Ðœ" ?

EDIT: The input is coming from a page loaded with curl. When I output the page content to my browser, the characters are displayed correctly (so I doubt the input is the problem).

like image 534
Olivier Lalonde Avatar asked Jan 26 '10 19:01

Olivier Lalonde


People also ask

How to use DOMDocument in PHP?

PHP | DOMDocument getElementsByTagName() Function The DOMDocument::getElementsByTagName() function is an inbuilt function in PHP which is used to return a new instance of class DOMNodeList which contains all the elements of local tag name.

What is loadHTML?

DOMDocument::loadHTMLThe function parses the HTML contained in the string source . Unlike loading XML, HTML does not have to be well-formed to load. This function may also be called statically to load and create a DOMDocument object.


2 Answers

Try:

$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); 
like image 155
Dmytro Zavalkin Avatar answered Sep 24 '22 02:09

Dmytro Zavalkin


I had a similar problem after using XPath to parse DomDocument, and after reading this

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

I solved it like this

// 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); 
like image 32
Nemke Avatar answered Sep 20 '22 02:09

Nemke