2013-09-27 27 views
0

我的國際公司工作,因此,我們有語言負荷,以應付。 我遇到了一些特殊字符的問題。的SimpleXML和法國的字符

我創建了一個獨立的測試PHP頁面,以消除可能通過我的系統引入的任何其他問題。

從i通讀我發現的SimpleXML處理的XML爲UTF-8的各種頁面。 如:PHP SimpleXML Values returned have weird characters in place of hyphens and apostrophes

,所以我所做的僅僅是在頁面的頂部:

header("Content-type:text/html; charset=UTF-8"); 

然後我做了這個檢查:

print mb_internal_encoding(); 

不知道這是正確的功能,但它在FF和Chome給了我ISO-8859-1。

XML看起來是這樣的:

$xml = '<?xml version="1.0" encoding="ISO-8859-15"?> 
<Tracking> 
<File> 
<FileNumber>çúé$`~ € Š š Ž ž Œ œ Ÿ</FileNumber> 
<OrigBranch>124</OrigBranch> 
<Login></Login> 
</File> 
</Tracking>'; 

這打印出所有的滑稽,但對於頁面,我需要,我不是太concrened它是如何在瀏覽器打印出的實際頁面實際上是從一個運行cron將XML導入到MYSQL數據庫中,所以不要太重要。它顯示在這樣FF雖然

print $xml; 
���$`~ � � � � � � � � � 124 

然後我創建的SimpleXML對象:

​​

此打印出:

[File] => SimpleXMLElement Object 
    (
     [FileNumber] => çúé$`~       
     [OrigBranch] => 124 
     [Login] => SimpleXMLElement Object 
      (
      ) 

    ) 

我不是太擔心了奇怪的字符打印$ xml ;,但更多需要修復插入到數據庫中的SimpleXMLElement對象中的字符。 爲什麼SimpleXMLElement對象失利後的「〜」字。我嘗試在頭函數調用中將字符集更改爲ISO-8859-15,但這隻會導致打印$ xml;稍顯好看,但仍然缺少後面的字符「〜」,但給的SimpleXMLElement致命錯誤:

'String could not be parsed as XML 

我解析XML嘗試過:

$xml = mb_convert_encoding($xml, "ISO-8859-15"); 
$xml = iconv('UTF-8', 'ISO-8859-15//TRANSLIT', $xml) 

但這些並沒有幫助。 有什麼建議嗎?

回答

0

我創建了latin1的特定文件(ISO-8859-1)命名latin1.xml與此內容(您可以在XML標籤添加encoding="UTF-8",這是相同的):

<?xml version="1.0"?> 
<Tracking> 
<File> 
<FileNumber>çùé$ °à §çòò àù§</FileNumber> 
<OrigBranch>124</OrigBranch> 
<Login></Login> 
</File> 
</Tracking> 

然後我裝在php文件中的內容,並從0取得的轉換到UTF-8,後與SimpleXMLElement的解析。 我呼應了XML的前

<?php 
$xml = file_get_contents('latin1.xml'); 
echo '<pre>'.$xml.'</pre>'."<br>"; 
$xml2 = iconv("ISO-8859-1","UTF-8",$xml); 
echo '<pre>'.$xml2.'</pre>'."<br>"; 
$parser = new SimpleXMLElement($xml2); 
echo '<pre>'.print_r($parser).'</pre>'."<br>"; 

內容現在加載腳本,如果你的瀏覽器設置使用UTF-8 econding,第一回聲會正確地沒有得到很好的顯示,但是這將是確定的第二和print_r($parser)。否則,如果瀏覽器設置爲ISO-8859-1,則會看到第一個回顯良好,但不會顯示第二個和print_r。

您可以根據自己的需要進行調整。

UPDATE

ISO/IEC 8859-1缺少法國和芬蘭文本的某些字符,以及歐元符號。 如果我理解得很清楚你的意見,你可以在ISO-8859-15有源文件(xml),這樣你就可以正確使用歐元符號。 我創建了一個新文件,名爲iso8859-15.xml,並在那裏爲您添加新的測試字符(也帶有歐元符號)。在PHP文件,我改變了第一個指令:

//$xml = file_get_contents('latin1.xml'); 
$xml = file_get_contents('iso8859-15.xml'); 

,後來,在轉換:

$xml2 = iconv("ISO-8859-15","UTF-8",$xml); 

現在加載腳本,如果你的瀏覽器設置使用UTF-8 econding,第一回聲將正確地顯示不好,但它將確定第二個和SimpleXml的輸出print_r($parser)

所以,現在你有你正確地(在UTF-8)解析的XML,你可以在DB寫入之前將其轉換(即在ISO-8859-15編碼,如果我理解正確的)。 更清晰,你可以加入這一行,到了最後,上面的PHP腳本:

echo '<pre> File number in ISO-8859-15 for db: '.iconv("UTF-8","ISO-8859-15",$parser->File->FileNumber).'</pre>'."<br>"; 

正如你可以看到我轉換UTF-8數據從使用SimpleXML ISO-8859-15,你應該什麼時候做」會寫在數據庫上。 這對我有效。

希望它有幫助

+0

謝謝Stramaz。 我試過不同的組合。我沒有看到字符「ŠšžŒœŸ」,因爲我沒有看到它經常被使用,但是「€」是至關重要的。新的測試特殊字符的字符串: 提示$'〜€°的§çòòàù§ 頁面的charset = UTF-8 + XML編碼= 「UTF-8」 - >打印XML字符搞笑,SimpleXML的突破 頁面的charset = ISO-8859-1 + XML編碼=「UTF-8」 - >打印XML良好,SImpleXML中斷。這是令人驚訝的,因爲我認爲「€」只能從ISO-8859-15 頁charset = ISO-8859-1 + XML編碼=「ISO-8859-1」 - > xml好,SImpleXML有趣的字符 – Shaakir

+0

...繼續 page charset = ISO-8859-15 + XML編碼=「ISO-8859-15」 - > xml good,SImpleXML有趣的字符 查看由此SImpleXML對象保存到數據庫的信息的頁面全部用字符集呈現= ISO-8859-15。所以對我來說重要的一部分是在SImpleXML對象中獲得正確的字符,並因此正確進入數據庫。 – Shaakir

+0

我在我的答案中提出並更新,它應該可以幫助你。讓我知道 – Stramaz

0

如果你建立XML,嘗試爲base64解碼所有的字符串,然後你在哪裏讀取XML客戶端編碼回

0

嘗試$xml = '<?xml version="1.0" encoding="UTF-8"?>...