Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

PHP iconv error

When I generate an XML file with an ASP Classic script, and import the XML file in a PHP page, the import process works fine.

But, when I generate the same XML through a PHP script (instead of ASP Classic) and use it in the same import process, then it's not working.

$xml = iconv("UTF-16", "UTF-8", $xml);

I noticed in my import process:

  • before the $xml = iconv("UTF-16", "UTF-8", $xml); line in my code, the XML file is in the proper format.
  • But after the $xml = iconv("UTF-16", "UTF-8", $xml); line, the XML file is corrupted.

When I comment this line of code out and use the PHP XML file, then it works fine.

like image 495
Deniyal Tandel Avatar asked Oct 05 '13 06:10

Deniyal Tandel


People also ask

What is Iconv function?

The iconv() function converts a sequence of characters in one character encoding to a sequence of characters in another character encoding.

What is Iconv in Linux?

iconv command is used to convert some text in one encoding into another encoding. If no input file is provided then it reads from standard input. Similarly, if no output file is given then it writes to standard output. If no from-encoding or to-encoding is provided then it uses current local's character encoding.


1 Answers

Resources: PHP official site- SimpleXMLElement documentation

If you claim that there is an error in this line:

$xml = iconv("UTF-16", "UTF-8", $xml);

then change it to this, because $xml is probably not "UTF-16":

$xml = iconv(mb_detect_encoding($xml), "UTF-8", $xml);

To save the XML file:

//saving generated xml file
$xml_student_info->asXML('file path and name');

To import the xml file:

$url = "http://www.domain.com/users/file.xml";
$xml = simplexml_load_string(file_get_contents($url));

If you have an array as follows:

$test_array = array (
  'bla' => 'blub',
  'foo' => 'bar',
  'another_array' => array (
    'stack' => 'overflow',
  ),
);

and you wish to convert it to the following XML:

<?xml version="1.0"?>
<main_node>
    <bla>blub</bla>
    <foo>bar</foo>
    <another_array>
        <stack>overflow</stack>
    </another_array>
</main_node>

then here's the PHP code:

<?php

//make the array
$test = array (
  'bla' => 'blub',
  'foo' => 'bar',
  'another_array' => array (
    'stack' => 'overflow',
  ),
);   

//make an XML object
$xml_test = new SimpleXMLElement("<?xml version=\"1.0\"?><main_node></main_node>");

// function call to convert array to xml
array_to_xml($test,$xml_test);

//here's the function definition (array_to_xml)
function array_to_xml($test, &$xml_test) {
    foreach($test as $key => $value) {
        if(is_array($value)) {
            if(!is_numeric($key)){
                $subnode = $xml_test->addChild("$key");
                array_to_xml($value, $subnode);
            }
            else{
                $subnode = $xml_test->addChild("item$key");
                array_to_xml($value, $subnode);
            }
        }
        else {
            $xml_test->addChild("$key","$value");
        }
    }
}

/we finally print it out
print $xml_test->asXML();

?>
like image 141
Anshu Dwibhashi Avatar answered Oct 23 '22 21:10

Anshu Dwibhashi