1. 程式人生 > >php往XML中寫入中文出現亂碼的解決方案

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'屬性中去。