This is a very specific charset converter, but you should be able to rewrite the code to fit your own needs. It's meant to convert an XML file from UTF-8 to ISO-8859-1, nothing else (well maybe the other way around too, I made support for that anyway).
<?php // Which charsets do we support? $charsets[] = "ISO-8859-1"; $charsets[] = "UTF-8"; if (!isset($_POST['charsetto'])) { ?> <html> <title>Charset converter</title> <body> <center><h3>Charset converter</h3></center> <form action="?" method="post" enctype="multipart/form-data"> Convert charset from: <select name="charsetfrom"> <?php foreach (array_reverse($charsets) as $charset) { echo "<option value=\"".$charset."\">".$charset."</option>"; } ?> </select><br> Convert charset to: <select name="charsetto"> <?php foreach ($charsets as $charset) { echo "<option value=\"".$charset."\">".$charset."</option>"; } ?> </select><br> <input type="file" name="convertme" id="convertme"><br> <input type="submit" value="Convert"> </form> </body> </html> <?php } else { $readcontent = file_get_contents($_FILES['convertme']['tmp_name']); $convertedcontent = iconv($_POST['charsetfrom'], $_POST['charsetto'], $readcontent); // Replace encoding header $convertedcontent = str_replace("encoding=\"".$_POST['charsetfrom']."\"", "encoding=\"".$_POST['charsetto']."\"", $convertedcontent); header("Content-Description: File Transfer"); // header("Content-Type: application/octet-stream"); header("Content-Type: text/xml"); header("Content-Disposition: attachment; filename=".basename($FILES['convertme']['name'])); header("Content-Transfer-Encoding: binary"); header("Expires: 0"); header("Cache-Control: must-revalidate"); header("Pragma: public"); header("Content-Length: ".$FILES['convertme']['size']); ob_clean(); flush(); echo $convertedcontent; } ?>