php往XML中寫入中文出現亂碼的解決方案
最近為了使用php往XML中寫入中文
但是總是出現亂碼
究其原因,是因為編碼沒有采用utf-8
雖然找到了原因,但是解決起來也是費了很多周折,找出問題花了不少時間,解決問題也花了不少時間
首先寫入xml之後,發現採用notepad開啟之後中文的地方總是亂碼,然後再次寫入,把notepad重新整理一下,可以出現中文,但是仍然無法用瀏覽器開啟,開啟就報錯。
如果寫入英文或者數字則不會出現上述問題。
今天,在網上找到一個直接讀寫一個xml檔案,然後再寫入到另一個檔案中,就不會出現上述問題,可以讀寫中文,不會出現亂碼。詳見上一篇博文《php讀寫XML檔案》。當然我這兒將程式碼進行了修改,沒有使用原來作者的程式碼。讀者可以自行進行修改。
但是我們一定會對檔案中的內容進行修改,在測試的過程中,按照下面的方法,仍然會出現了亂碼
if($users->id == 'ST01')
$users->text='修改了的';
這樣寫完之後,開啟xml檔案,仍然是亂碼,但是將其轉換為utf-8或者用記事本開啟就發現其是正常的。
所以確定是在寫入文字的時候出現的亂碼。於是搜尋php如何將字串轉換為utf-8編碼,
得到如下的內容,其中紅色字樣為解決我困擾了好幾天的關鍵字樣
===============================================(來自百度)
1、把 GBK 編碼字串轉換成 UTF-8 編碼字串 view plaincopy to clipboardprint? <?php header("content-Type: text/html; charset=Utf-8"); echo mb_convert_encoding("你是我的好朋友","UTF-8","GBK");
2、把 UTF-8 編碼字串轉換成 GB2312 編碼字串 view plaincopy to clipboardprint? // 注意將此檔案存檔成 utf-8 編碼格式檔案再測試 <?php header("content-Type:text/html;charset=gb2312"); echo mb_convert_encoding("你是我的好朋友","gb2312","utf-8"); ?> // 注意將此檔案存檔成 utf-8 編碼格式檔案再測試 <?php header("content-Type: text/html; charset=gb2312"); echo mb_convert_encoding("你是我的好朋友","gb312","utf-8"); ?>
3、對整個頁面進行轉換 該方法適用所有編碼環境。這樣把前128個字元以外(顯示字元)的字符集都用 NCR(Numeric character reference,如“漢字”將轉換成“漢字”這種形式)來表示,這樣的編碼在任意編碼環境下頁面都能正常顯示。 在php檔案的頭部加上下面三行程式碼: view plaincopy to clipboardprint? mb_internal_encoding(”gb2312″); // 這裡的gb2312是你網站原來的編碼 mb_http_output(”HTML-ENTITIES”); ob_start(’mb_output_handler’); mb_internal_encoding(”gb2312″); // 這裡的gb2312是你網站原來的編碼 mb_http_output(”HTML-ENTITIES”); ob_start(’mb_output_handler’); 使用mb_convert_encoding 函式需啟用PHP 的mbstring (multi-byte string)擴充套件
================================================
修改自己的程式碼,終於 成功了!寫入了正常中文到xml檔案中了!
wirtexmltest.php
<?php
header("content-Type: text/html; charset=Utf-8");
//header("content-type:text/html; charset=utf-8"); //指定PHP使用UTF-8編碼
//$xml = simplexml_load_file("testa.xml"); //讀取xml檔案
//$newxml = $xml->asXML(); //標準化$xml
//$fp = fopen("test.xml", "w"); //新建xml檔案
//fwrite($fp, $newxml); //寫入-------xml檔案
//fclose($fp);
echo "php讀取XML檔案 <br>";
header("content-type:text/html; charset=utf-8"); //設定編碼
$linesss = simplexml_load_file('testa.xml'); //載入xml檔案 $lists和xml檔案的根節點是一樣的
//$companyName = $linesss->company;
//echo $companyName; //直接輸出
echo "<br>";
foreach($linesss->item as $users){ //有多個user,取得的是陣列,迴圈輸出
print($users->id);
print($users->text);
if($users->id == 'ST01')
$users->text= mb_convert_encoding('修改了的',"UTF-8","GBK");
if($users->id == 'SW00w23')
$users->text= mb_convert_encoding('修改了222的',"UTF-8","GBK");
echo "<br>";
}
header("content-type:text/html; charset=utf-8"); //指定PHP使用UTF-8編碼
//$xml = simplexml_load_file("test.xml"); //讀取xml檔案
$newxml = $linesss->asXML(); //標準化$xml
$fp = fopen("test.xml", "w"); //新建xml檔案
fwrite($fp, $newxml); //寫入-------xml檔案
fclose($fp);
?>
testa.xml即源xml檔案
<?xml version="1.0" encoding="utf-8"?>
<items>
<item>
<id>ST01</id>
<text>測試說明</text>
</item>
<item>
<id>SW00w23</id>
<text>測試說明</text>
</item>
<item>
<id>SW0103</id>
<text>測試說明</text>
</item>
</items>
測試結果test.xml即即將寫入的xml檔案
<?xml version="1.0" encoding="utf-8"?>
<items>
<item>
<id>ST01</id>
<text>修改了的</text>
</item>
<item>
<id>SW00w23</id>
<text>修改了222的</text>
</item>
<item>
<id>SW0103</id>
<text>測試說明</text>
</item>
</items>
如果是一個變數,就採用下述方法
$txt = trim($_POST["txtcontent"]);
$text = mb_convert_encoding(($txt),"UTF-8","GBK");
$rootdata->setAttribute('text',$text);
最關鍵的就是上面的兩行程式碼,這裡是post得到的一個變數$txt,$txt = trim($_POST["txtcontent"]);然後將其轉換為utf-8編碼$text = mb_convert_encoding(($txt),"UTF-8","GBK");
最後將其寫入到xml的'text'屬性中去。