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




utf-8 domdocument (4)

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

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

ירושלים

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

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


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

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

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


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

जैसे

$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);

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


यदि आप DOMDocument के साथ UTF-8 आउटपुट करना चाहते हैं, तो आपको यह निर्दिष्ट करना होगा। सरल, है ना? यदि आप पहले से ही एक चाल की समस्या को गंध करते हैं, तो आप बहुत दूर नहीं हैं, लेकिन पहली नजर पर, यह वाकई सीधे आगे है

निम्नलिखित पर विचार करें (यूटीएफ -8 एन्कोडेड) कोड -उदाहरण जो हेक्साडेसिमल इकाइयों को आउटपुट करता है:

$dom = new DOMDocument();
$dom->loadXml('<root>ירושלים</root>');
$dom->save('php://output');

आउटपुट:

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

जैसा लिखा है, यदि आप इसे यूटीएफ -8 के रूप में आउटपुट करना चाहते हैं, तो आपको इसे निर्दिष्ट करना होगा, और यह सीधे आगे है:

...
$dom->encoding = 'UTF-8';
$dom->save('php://output');

आउटपुट तब स्पष्ट रूप से यूटीएफ -8 में है:

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

सीधे आगे भाग के लिए इतना। यदि आप गंदे छोटे विवरणों में रुचि रखते हैं, तो आप पढ़ने के लिए स्वतंत्र हैं - यदि नहीं, तो कृपया "क्यों नहीं " पूछें ? :)।

मैंने अभी "यूटीएफ -8 में स्पष्ट रूप से " लिखा है क्योंकि पहले उदाहरण में भी यूटीएफ -8 एनकोडेड आउटपुट है, एक्सएमएल में केवल हेक्साडेसिमल इकाइयां हैं जो पूरी तरह वैध हैं- यहां तक ​​कि यूटीएफ -8 में भी!

आप पहले से ही नोटिस करते हैं कि मैं यहाँ चुटकुले के साथ शुरुआत करता हूं, लेकिन याद रखना है: यूटीएफ -8 XML का डिफ़ॉल्ट एन्कोडिंग है

और यदि आप अब कहने लगते हैं: अरे प्रतीक्षा करें, यदि डिफ़ॉल्ट एन्कोडिंग UTF-8 है तो भी, क्यों PHP DOMDocument पहली जगह में संस्थाओं का उपयोग करता है?

खैर, सच्चाई यह है कि यह सवाल में खोज के विपरीत नहीं हैहमेशा नहीं

निम्न उदाहरण देखें जो Ivrit पत्र वाले नोड मान के बजाय XML- टिप्पणी का उपयोग कर रहा है:

$dom = new DOMDocument();
$dom->loadXml('<root><!-- ירושלים --></root>');
$dom->save('php://output');

आउटपुट:

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

ठीक है, सब साफ है? तो यहां गंदी थोड़ा गुप्त है: चाहे आप उन XML संस्थाओं को वहां या नहीं मिलें - दस्तावेज़ के लिए यह कोई फर्क नहीं पड़ता, यह एक ही एक्सएमएल चरित्र डेटा लिखने का एक अलग रूप है। और आप पहले से ही आमंत्रित महसूस करते हैं: पहले उदाहरण के लिए सीडीएटीए की कोशिश करें:

$dom = new DOMDocument();
$dom->loadXML("<root><![CDATA[ירושלים]]></root>");
$dom->save('php://output');

आउटपुट:

<?xml version="1.0"?>
<root><![CDATA[ירושלים]]></root>

जैसा कि यह दर्शाता है कि एक्सएमएल-टिप्पणी उदाहरण से पहले, यहां कोई एक्सएमएल संस्थाएं नहीं हैं। ठीक है, वे वैसे भी मान्य नहीं होंगे, जैसे XML- टिप्पणी उदाहरण के साथ

अवलोकन के लिए एक उदाहरण बना देता है जिसमें ये सभी शामिल हैं:

$dom = new DOMDocument();
$dom->loadXML("<!-- ירושלים --><root>&#x5D9;רושלים <![CDATA[ירושלים]]></root>");
$dom->save('php://output');

आउटपुट:

<?xml version="1.0"?>
<!-- ירושלים -->
<root>&#x5D9;&#x5E8;&#x5D5;&#x5E9;&#x5DC;&#x5D9;&#x5DD; <![CDATA[ירושלים]]></root>

सीख सीखी:

  • यूटीएफ -8 हमेशा उपयोग किया जाता है बस कुछ संस्थाओं को पीसीडीएटीए में उपयोग किया जाता है जब तक यूटीएफ -8 एन्कोडिंग निर्दिष्ट नहीं किया जाता है। यदि यूटीएफ -8 एन्कोडिंग के लिए अलग है, तो अलग-अलग नियम लागू होंगे ।
  • यदि आप संस्थाओं का उपयोग करना चाहते हैं या नहीं, तो आप निर्दिष्ट नहीं कर सकते हैं कि एक XML दस्तावेज़ को यूटीएफ -8 एन्कोडेड स्ट्रिंग के रूप में PHPs DOMDocument per-se यहां तक ​​कि कोई भी libxml झंडे के साथ नहीं और एक BOM प्रदान करके [1]
  • आप निर्दिष्ट कर सकते हैं कि आप यूटीएफ -8 को दस्तावेज़ एन्कोडिंग सेट करके संस्थाओं का उपयोग नहीं करना चाहते हैं।
  • यदि आप कर सकते हैं, तो आप गॉर्डन के जवाब में बताए गए दस्तावेज़ एन्कोडिंग को निर्दिष्ट करते हुए XML- घोषणा वाले इनपुट स्ट्रिंग को हेरफेर कर सकते हैं।

युक्ति: यदि आपकी स्ट्रिंग में एक्सएमएल-घोषणा है जो स्ट्रिंग एन्कोडिंग में बेमेल है या आप दोनों को या तो DOMDocument में स्ट्रिंग लोड करने से पहले बदलना चाहते हैं, तो आपको एक्सएमएल-डेक्लेरेशन और / या स्ट्रिंग को फिर से सांकेतिक रूप से बदलना होगा। यह प्रश्न PHP XMLRecoder उत्तर में शामिल किया गया है , संस्करण और एन्कोडिंग को दिखाकर कैसे XMLRecoder वर्ग काम करता है।

और यह उम्मीद है कि

[1] शायद यदि आप एक HTTP अनुरोध से लोड करते हैं और आप स्ट्रीम संदर्भ प्रदान करते हैं और मेटा-डेटा के माध्यम से वर्ण एन्कोडिंग ध्वज करते हैं - लेकिन यह पहले परीक्षण किया जाना चाहिए, मुझे नहीं पता है जो बीओएम काम नहीं करता है, यह कुछ हद तक एक संकेत है कि ये सब काम नहीं करते हैं।





hebrew