2009-08-30 6 views
2

XMLソースをリモートからロードしようとしているため、フォーマットを制御できません。残念ながら、私は負荷にしようとしているXMLファイルには、何のエンコーディングを持っていない:何かしようとするとPHPが正しいエンコーディングを示すことができない場合にXMLをロードするには?

<ROOT xmlns:sql="urn:schemas-microsoft-com:xml-sql"> <NODE> </NODE> </ROOT> 

$doc = new DOMDocument(); 
$doc->load(URI); 

を私が取得:

Input is not proper UTF-8, indicate encoding ! Bytes: 0xA3 0x38 0x2C 0x38 

アイブ氏はこれを抑制するための方法を見て運がない。これをロードしてDOMDocumentで使用できるようにするにはどうすればよいですか?

答えて

0

代わりにXMLReaderクラスを使用してみてください。 XMLReaderはXML用に特別に設計されており、使用するエンコーディング(noneには 'null'を含む)のオプションがあります。

1

XML宣言を追加する際に配信されるエンコーディングを指定するために、ドキュメントを編集することができます(「前処理」)。それはもちろん、自分自身を確かめる必要があります。 DOMオブジェクトは、それを解析する必要があります。

例XML宣言:

<?xml version="1.0" encoding="UTF-8" ?> 
+0

バイトは不満されているそのISO-8859-1ではなく、UTF-8ことを示しています。特に、0xA3はGBP通貨記号(ポンド記号)です。 –

+0

明らかに、UTF-8ではありませんでしたが、これは問題ではありませんでした。私は重要な言葉「例」を参照します。 FYI。これらのコードは、ISO-8859-1を自動的に推論するものではありません。 – Rushyo

-1

私は似たような状況に走りました。私は、UTF-8でエンコードされているはずのXMLファイルを取得していましたが、いくつかの悪いISO文字が含まれていました。

私はでより詳細に解決策について投稿UTF-8

<?php 

# The XML file with bad characters 
$filename = "sample_xml_file.xml"; 

# Read file contents to a variable 
$contents = file_get_contents($filename); 

# Find the bad characters 
preg_match_all('/[^(\x20-\x7F)]*/', $contents, $badchars); 

# Process bad characters if some were found 
if(isset($badchars[0])) 
{ 
     # Narrow down the results to uniques only 
     $badchars[0] = array_unique($badchars[0]); 

     # Replace the bad characters with their UTF8 equivalents 
     foreach($badchars[0] as $badchar) 
     { 
       $contents = preg_replace("/".$badchar."/", utf8_encode($badchar), $contents); 
     } 
} 

# Write the fixed contents back to the file 
file_put_contents($filename, $contents); 

# Cleanup 
unset($contents); 

# Now the bad characters have been encoded to UTF8 
# It will now load file with DOMDocument 
$dom = new DOMDocument(); 
$dom->load($filename); 

?> 

に不正な文字をエンコードするために、次のコードを書いた:あなたはUTFにあなたの文書を変換するためにきた http://dev.strategystar.net/2012/01/convert-bad-characters-to-utf-8-in-an-xml-file-with-php/

1

-8、最も簡単なのはutf8_encode()です。

DOMDOCUMENT例:

$doc = new DOMDocument(); 
$content = utf8_encode(file_get_contents($url)); 
$doc->loadXML($content); 

のSimpleXMLの例:あなたは現在のエンコーディングがわからない場合

$xmlInput = simplexml_load_string(utf8_encode(file_get_contents($url_or_file))); 

、例えば、mb_detect_encoding()を使用します。

$content = utf8_encode(file_get_contents($url_or_file)); 
$encoding = mb_detect_encoding($content); 
$doc = new DOMdocument(); 
$res = $doc->loadXML("<?xml encoding='$encoding'>" . $content); 

注:

  • エンコードが検出されない場合(関数はFALSEを返します)、エンコードをutf8_encode()で強制しようとする場合があります。
  • $doc->loadHTMLでhtmlコードを読み込んでいる場合でも、引き続きXMLヘッダーを使用できます。

あなたはエンコーディングを知っていれば、それを変換するためにiconv()を使用します。

$xml = iconv('ISO-8859-1' ,'UTF-8', $xmlInput) 
関連する問題