DOMDocument::loadHTML()
एक HTML स्ट्रिंग की उम्मीद है। प्रति यह चश्मा है
HTML को डिफ़ॉल्ट रूप ISO-8859-1
एन्कोडिंग (आईएसओ लैटिन वर्णमाला नंबर 1) का उपयोग करता है। यह अब से लंबा है, 6.1. The HTML Document Character Set देखें। हकीकत में यह सामान्य वेबब्रोसर में Windows-1252
के लिए डिफ़ॉल्ट समर्थन है।
मैं अब तक वापस जाता हूं क्योंकि PHP का DOMDocument libxml पर आधारित है और यह HTMLparser लाता है जो HTML 4.0 के लिए डिज़ाइन किया गया है।
मैं कहूंगा कि यह मानना सुरक्षित है कि आप ISO-8859-1
एन्कोडेड स्ट्रिंग लोड कर सकते हैं।
आपकी स्ट्रिंग UTF-8
एन्कोडेड है। सभी पात्रों को 127/h7F से HTML Entities में बदलें और आप ठीक हैं। आपको लगता है कि अपनी खुद की नहीं करना चाहते हैं, कि क्या mb_convert_encoding
HTML-ENTITIES
लक्ष्य एन्कोडिंग के साथ करता है:
- उन अक्षर हैं जो संस्थाओं नामित किया है, नामित entitiy मिल जाएगा।
€ -> €
- दूसरों को उनकी संख्यात्मक (दशमलव) इकाई मिलती है, उदा।
$html = preg_replace_callback('/[\x{80}-\x{10FFFF}]/u', function($match) {
list($utf8) = $match;
$entity = mb_convert_encoding($utf8, 'HTML-ENTITIES', 'UTF-8');
printf("%s -> %s\n", $utf8, $entity);
return $entity;
}, $html);
अपने स्ट्रिंग के लिए यह अनुकरणीय आउटपुट: ☆ -> ☆
निम्नलिखित है कि एक कॉलबैक फ़ंक्शन का उपयोग करके प्रगति में थोड़ा और अधिक से दिखाई दे रही एक कोड उदाहरण है
☆ -> ☆
☆ -> ☆
☆ -> ☆
वैसे भी, यह सिर्फ आपकी स्ट्रिंग में गहरी लग रही है। आप इसे या तो एन्कोडिंग loadHTML
में परिवर्तित करना चाहते हैं। यही कारण है कि एचटीएमएल संस्थाओं में US-ASCII
के सभी बाहर परिवर्तित करके किया जा सकता है:
$us_ascii = mb_convert_encoding($utf_8, 'HTML-ENTITIES', 'UTF-8');
लें देखभाल कि आपके इनपुट वास्तव में UTF-8 एन्कोडेड है।यदि आपके पास मिश्रित एन्कोडिंग भी हैं (जो कुछ इनपुट के साथ हो सकती हैं) mb_convert_encoding
प्रति स्ट्रिंग केवल एक एन्कोडिंग को संभाल सकता है। मैंने पहले से ही रेखांकित किया है कि नियमित रूप से अभिव्यक्तियों की सहायता से स्ट्रिंग प्रतिस्थापन कैसे करें, इसलिए मैं अब और विवरण छोड़ देता हूं।
अन्य विकल्प संकेत एन्कोडिंग है। यह दस्तावेज़ को संशोधित करके और
<meta http-equiv="content-type" content="text/html; charset=utf-8">
जो एक सामग्री-प्रकार है जो एक वर्णमाला निर्दिष्ट करता है जोड़कर किया जा सकता है। एचटीएमएल स्ट्रिंग्स के लिए यह भी सबसे अच्छा अभ्यास है जो वेबसर्वर के माध्यम से उपलब्ध नहीं है (उदा। डिस्क पर सहेजा गया है या आपके उदाहरण में स्ट्रिंग के अंदर)। वेबसर्वर आमतौर पर सेट हेडर के रूप में सेट करता है।
$dom = new DomDocument();
$dom->loadHTML('<meta http-equiv="content-type" content="text/html; charset=utf-8">'.$html);
एचटीएमएल प्रति 2.0 चश्मा, तत्वों है कि केवल एक दस्तावेज़ के <head>
अनुभाग में दिखाई कर सकते हैं:
आप गलत चेतावनी की परवाह नहीं करते हैं, तो आप बस इसे स्ट्रिंग के सामने जोड़ सकते हैं , स्वचालित रूप से वहां रखा जाएगा। यह भी यहां होता है। निर्गम (सुंदर प्रिंट):
<!DOCTYPE html>
<html>
<head>
<meta http-equiv="content-type" content="text/html; charset=utf-8">
<meta charset="utf-8">
<title>Test!</title>
</head>
<body>
<h1>☆ Hello ☆ World ☆</h1>
</body>
</html>
सवाल को लाने के लिए धन्यवाद, एक ऐसी ही एक है: यहाँ एक नमूना कोड [चीनी या अन्य विदेशी भाषा रखने के लिए कैसे के रूप में वे उन्हें कोड में परिवर्तित करने के बजाय कर रहे हैं?] (Http: // stackoverflow .com/q/10237238/367456) हालांकि आप एक हैक पर विचार कर सकते हैं। – hakre
संबंधित: [PHP अनुरोध # 47875 - एचटीएमएल इनपुट एन्कोडिंग सेट करने के लिए कोई विकल्प नहीं] (https://bugs.php.net/bug.php?id=47875) – hakre
आश्चर्यजनक रूप से पर्याप्त: PHP-दस्तावेज़ कहता है: 'डीओएम एक्सटेंशन यूटीएफ -8 एन्कोडिंग का उपयोग करता है। आईएसओ -885 9 -1 एन्कोडिंग या अन्य एन्कोडिंग के लिए आईकॉनवी में ग्रंथों के साथ काम करने के लिए utf8_encode() और utf8_decode() का उपयोग करें। देखें: http://www.php.net/manual/en/intro.dom.php – jens