2011-01-11 25 views
0

私はXMLコードを返すAPIを構築しています。例えば、APIが返されます:アンパサンド(&)でutf8_decodeエラー

<message>hello, this is a message &amp; it used htmlsepcialchars</message> 

私はのfile_get_contents()を使用して配列に返された情報をロードするために()simplexml_load_stringています。

それから、受信したウェブサイト上でutf8_decode()を使ってメッセージをフレンドリな文字セットに変換しました。しかし、私は、メッセージ内のアンパサンド(&)に次のメッセージのピンポイントを受け取る:

Warning: main() [function.main]: unterminated entity reference 

によりアンパサンドに、メッセージの残りの部分が切り捨てられます。任意のアイデアはどのようにこの問題を回避するには?

+1

おそらく、 'simplexml_load_string()'は '&'を単にアンパサンドにしていますか?おそらくそれを再エンコードすることが役に立ちます。 ( 'htmlentities()'が役に立ちます) – Amber

+0

クイックコメント: 'file_get_contents()'は必要ありません。 'simplexml_load_file( '/ path/to/file');'そのエラーを生成するファイルに追加します。 –

答えて

0

私の答え、ユーザーエラーが見つかりました。私は基本的に私のコードのどこかで再びエスケープしていました。

0

アンパサンドはエンコードされていないようですので、ダブルデコードするかCDATAフィールドに挿入してください。

通常、そのような特殊文字はCDATAフィールドに入れる必要があります。エンコードする手間を省くことができます。 PHPのDOM作成関数には、必要なものがあります。


$doc->createCDATASection 

そしてもちろん:

http://www.w3schools.com/Xml/xml_cdata.asp

http://fr.php.net/manual/en/function.domdocument-create-cdata-section.php

+0

特殊文字を "エンコード"(またはエスケープ、むしろ)するのではなく、事実上シナリオがありません。あなたは盲目的に '<![CDATA ['と ']]>'の間にどんなテキストを置いても、あなたのXMLを無効にするものがテキストに含まれていないことを望んでいません。 DOMメソッドを使用すると、入力は自動的にエスケープされます(CDATAなど)。問題はありません。 –

+0

私はそれが彼にそれをやっているのを救ったと言っている理由です。 – cromestant

0

まあ、SimpleXMLの文字列はエンコードUTF8、およびエンティティがエスケープされなければならない値でなければなりません。 コードにはutf_decode()が本当に必要ですか?

+0

SimpleXMLはUTF-8に限定されず、ファイルが有効である限り、ほとんどのエンコードをロードできます(正しいエンコードが宣言されている限り、IOW)。 –

関連する問題