मेरे पास एक XML दस्तावेज़ है जो ITF-16 LE एन्कोडिंग है। उसके कारण, यह wp सभी आयात का उपयोग करके पढ़ने योग्य नहीं है।

जब मैं संस्करण अनुभाग में देखता हूं, तो मुझे यह दिखाई देता है

<?xml version="1.0" encoding="Unicode" ?> और मेरे दृश्य स्टूडियो कोड में मैं नीचे देखता हूं। UTF-16 LE

मैं विजुअल स्टूडियो का उपयोग करके पहले ही बदल चुका हूं, लेकिन चूंकि यह हर बार (उसी प्रारूप में) एक नई फाइल बनने जा रहा है। यह बहुत अच्छा होगा यदि PHP इसे UTF-8 में बदल सके

<?xml version="1.0" encoding="Unicode" ?>
<root>
  <docs>

क्या PHP का उपयोग करके इस फ़ाइल के एन्कोडिंग को बदलना संभव है?

0
user11398537 5 सितंबर 2019, 17:42
mb_convert_encoding काम कर सकता है
 – 
apokryfos
5 सितंबर 2019, 17:45
निर्दिष्ट लक्ष्य एन्कोडिंग के साथ एक साधारण एक्सएसएलटी काम करेगा।
 – 
Yitzhak Khabinsky
5 सितंबर 2019, 17:50

2 जवाब

सबसे बढ़िया उत्तर

DOMDocument::loadXML() XML घोषणा से एन्कोडिंग विशेषता को पढ़ता है। लेकिन Unicode मान्य एन्कोडिंग नहीं है afaik - मैं UTF-16LE की अपेक्षा करता हूं। PHP में DOM API UTF-8 का उपयोग करता है। तो यह यूटीएफ -8 (परिभाषित एन्कोडिंग के आधार पर) को कुछ भी डीकोड करेगा और लक्ष्य दस्तावेज़ के एन्कोडिंग के आधार पर इसे एन्कोड करेगा। आप इसे लोड करने के बाद ही बदल सकते हैं।

यहाँ एक डेमो है:

$xml = <<<'XML'
<?xml version="1.0" encoding="utf-8"?>
<foo>ÄÖÜ</foo>
XML;

$document = new DOMDocument();
$document->loadXML($xml);

$encodings = ['ASCII', 'UTF-16', 'UTF-16LE', 'UTF-16BE'];

foreach ($encodings as $encoding) {
    // set required encoding
    $document->encoding = $encoding;
    // save
    echo $encoding."\n".$document->saveXML()."\n";
}

आउटपुट:

ASCII
<?xml version="1.0" encoding="ASCII"?>
<foo>&#196;&#214;&#220;</foo>

UTF-16
��<?xml version="1.0" encoding="UTF-16"?>
<foo>���</foo>

UTF-16LE
<?xml version="1.0" encoding="UTF-16LE"?>
<foo>���</foo>

UTF-16BE
<?xml version="1.0" encoding="UTF-16BE"?>
<foo>���</foo>

जेनरेट की गई स्ट्रिंग परिभाषित एन्कोडिंग के साथ बदलती है।

मैंने यहां एक यूटीएफ -8 दस्तावेज़ के साथ शुरुआत की - क्योंकि एसओ यूटीएफ -8 ही है और आप इस तरह से गैर-असीसी वर्ण देख सकते हैं। ASCII गैर-असीसी वर्णों के लिए इकाई एन्कोडिंग को ट्रिगर करता है। UTF-16 बाइट ऑर्डर प्रदान करने के लिए एक बीओएम जोड़ता है। SO UTF-16 एन्कोडेड वर्ण प्रदर्शित नहीं कर सकता - इसलिए आपको � प्रतीक मिलता है। UTF-16LE और UTF-16BE एन्कोडिंग में बाइट क्रम को परिभाषित करते हैं, किसी BOM की आवश्यकता नहीं है।

बेशक यह वही काम करता है जो दूसरी तरफ है।

1
ThW 10 सितंबर 2019, 15:20
मुझे लगता है कि आपके स्पष्ट आउटपुट में भ्रमित है और आपके उत्तर से अलग है। निश्चित रूप से, यह केवल उस तरीके का एक आर्टिफैक्ट है जिसमें आप आउटपुट को कैप्चर कर रहे हैं और आउटपुट फ़ाइल में क्या लिखा जाएगा इसका प्रतिबिंब नहीं है।
 – 
Tom Blodget
6 सितंबर 2019, 00:59
यह एक आउटपुट के लिए जो लिखा जाएगा उसका प्रतिबिंब है। इसे टूटे हुए वर्ण दिखाना है क्योंकि SO जैसा UTF-8 पृष्ठ UTF-16 एन्कोडेड वर्ण प्रदर्शित नहीं कर सकता है।
 – 
ThW
6 सितंबर 2019, 14:39

यहां एक सामान्य एक्सएसएलटी है जो आपके संपूर्ण इनपुट एक्सएमएल को कॉपी करेगा, लेकिन एक्सएसएल: आउटपुट में निर्दिष्ट एन्कोडिंग के साथ। जो बचा है वह सिर्फ PHP में XSLT रूपांतरण चलाने के लिए है।

एक्सएसएलटी

<?xml version="1.0"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
    <xsl:output method="xml" indent="yes" encoding="utf-8"/>

    <xsl:template match="node()|@*">
        <xsl:copy>
            <xsl:apply-templates select="node()|@*"/>
        </xsl:copy>
    </xsl:template>
</xsl:stylesheet>
1
Yitzhak Khabinsky 5 सितंबर 2019, 18:09
यहां एक्सएसएलटी की जरूरत नहीं है। इसे एक्सएमएल को डीओएम (एक्सटी/एक्सएसएल के साथ) में लोड करने की आवश्यकता होगी और यदि आप ऐसा करते हैं तो आप केवल एन्कोडिंग प्रॉपर्टी सेट कर सकते हैं और दस्तावेज़ को सहेज सकते हैं।
 – 
ThW
5 सितंबर 2019, 22:51