php: जब भी मैं यूटीएफ-8 लिखने की कोशिश करता हूं, तब डोमडॉक्यूमेंट का उपयोग करते हुए इसे हेक्साडेसिमल अंकन लिखता है




utf-8 domdocument (5)

जब मैं यूटीएफ -8 स्ट्रिंग को एक XML फ़ाइल में डोमड्यूकास्ट का उपयोग करने की कोशिश करता हूं तो यह वास्तव में स्ट्रिंग के बजाय स्ट्रिंग के हेक्साडेसिमल अंकन लिखता है।

उदाहरण के लिए:

ירושלים

के बजाय: ירושלים

किसी भी विचार कैसे इस मुद्दे को हल करने के लिए?


$doc = new DOMDocument();
$doc->loadHTML('<?xml encoding="UTF-8">' . $html);

// dirty fix
foreach ($doc->childNodes as $item)
  if ($item->nodeType == XML_PI_NODE)
    $doc->removeChild($item); // remove hack
$doc->encoding = 'UTF-8'; // insert proper

जब मैं लिखने के लिए DomDocument बनाया है, मैंने निम्नलिखित पैरामीटर जोड़े हैं:

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

इन मापदंडों के कारण यूटीएफ -8 स्ट्रिंग को लिखे जाने की वजह से है।


ठीक अब तुम शुरु करो:

$dom = new DOMDocument('1.0', 'utf-8');
$dom->appendChild($dom->createElement('root'));
$dom->documentElement->appendChild(new DOMText('ירושלים'));
echo $dom->saveXml();

ठीक काम करेंगे, क्योंकि इस मामले में, आपके द्वारा बनाया गया दस्तावेज़ दूसरे तर्क के रूप में निर्दिष्ट एन्कोडिंग को बनाए रखेगा:

<?xml version="1.0" encoding="utf-8"?>
<root>ירושלים</root>

हालांकि, एक बार जब आप XML को एक दस्तावेज़ में लोड करते हैं जो एक एन्कोडिंग निर्दिष्ट नहीं करता है, तो आप कन्स्ट्रक्टर में घोषित कुछ भी खो देंगे, जिसका मतलब है:

$dom = new DOMDocument('1.0', 'utf-8');
$dom->loadXml('<root/>'); // missing prolog
$dom->documentElement->appendChild(new DOMText('ירושלים'));
echo $dom->saveXml();

यूटीएफ -8 की एक एन्कोडिंग नहीं होगी:

<?xml version="1.0"?>
<root>&#x5D9;&#x5E8;&#x5D5;&#x5E9;&#x5DC;&#x5D9;&#x5DD;</root>

तो अगर आप कुछ लोड करें, तो सुनिश्चित करें कि यह है

$dom = new DOMDocument();
$dom->loadXml('<?xml version="1.0" encoding="utf-8"?><root/>');
$dom->documentElement->appendChild(new DOMText('ירושלים'));
echo $dom->saveXml();

और यह अपेक्षा के अनुरूप काम करेगा

वैकल्पिक रूप से, आप दस्तावेज़ लोड करने के बाद भी एन्कोडिंग निर्दिष्ट कर सकते हैं।


जाहिरा तौर पर दस्तावेज़ एलेमेंट को $ नोड के रूप में सहेजा जा रहा है, इसके चारों ओर एक्सएमएल को बचाने के लिए, हालांकि मैं नहीं कह सकता कि मैं क्यों समझता हूँ

जैसे

$dom->saveXML($dom->documentElement);

बजाय:

$dom->saveXML();

स्रोत: http://www.php.net/manual/en/domdocument.savexml.php#88525


बिंदु के जवाब में यह है:

सामग्री प्राप्त करने के ठीक बाद, जब आपका फ़ंक्शन शुरू होता है, तो ऐसा करें:

  $content = mb_convert_encoding($content, 'HTML-ENTITIES', 'UTF-8');

और फिर नया दस्तावेज़ आदि शुरू करें। यह उदाहरण के रूप में देखें:

    if ( empty( $content ) ) {
        return false;
    }
    $doc = new DOMDocument('1.0', 'utf-8');
    libxml_use_internal_errors(true);
    $doc->LoadHTML($content, LIBXML_HTML_NOIMPLIED | LIBXML_HTML_NODEFDTD);

फिर जो भी आप अपने कोड के साथ करने का इरादा रखते थे





hebrew