web-dev-qa-db-ja.com

エラー:「入力は適切なUTF-8ではありません。エンコーディングを示してください!」 PHPのsimplexml_load_stringを使用する

エラーが発生しています:

parser error : Input is not proper UTF-8, indicate encoding ! Bytes: 0xED 0x6E 0x2C 0x20

サードパーティのソースからのsimplexml_load_stringを使用してXML応答を処理しようとしたとき。生のXML応答はコンテンツタイプを宣言します。

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

それでも、XMLは実際にはUTF-8ではないようです。 XMLコンテンツの言語はスペイン語で、XMLにDublínなどの単語が含まれています。

サードパーティにXMLを整理させることはできません。

XMLを前処理し、エンコードの非互換性を修正するにはどうすればよいですか?

XMLファイルの正しいエンコードを検出する方法はありますか?

58
Camsoft

0xED 0x6E 0x2C 0x20バイトはISO-8859-1の「ín」に対応しているため、コンテンツはUTF-8ではなくISO-8859-1にあるように見えます。データプロバイダーにそのことを伝え、修正するよう依頼してください。それがあなたにとってうまくいかない場合、おそらく他の人にとってもうまくいかないからです。

これを回避する方法がいくつかありますが、XMLを正常にロードできない場合にのみを使用する必要があります。それらの1つはutf8_encode()を使用することです。欠点は、そのXMLに有効なUTF-8とISO-8859-1の両方が含まれている場合、結果に mojibake が含まれることです。または、iconv()またはmbstringを使用して、文字列をUTF-8からUTF-8に変換してみて、修正されることを期待できます。 (それらはそうしませんが、少なくとも無効な文字を無視してXMLをロードできます)

または、長くて長い道のりを自分でシーケンスを検証/修正することができます。 UTF-8に慣れているかどうかにもよりますが、しばらく時間がかかります。おそらくそれを行うライブラリがありますが、私にはわかりません。

いずれにしても、無効なデータを送信していることをデータプロバイダーに通知して、データを修正できるようにします。


ここに部分的な修正があります。間違いなくすべてが修正されるわけではありませんが、一部は修正されます。プロバイダが問題を解決するまで、あなたがうまくやっていけることを願っています。

function fix_latin1_mangled_with_utf8_maybe_hopefully_most_of_the_time($str)
{
    return preg_replace_callback('#[\\xA1-\\xFF](?![\\x80-\\xBF]{2,})#', 'utf8_encode_callback', $str);
}

function utf8_encode_callback($m)
{
    return utf8_encode($m[0]);
}
73
Josh Davis

私はこれを使用して解決しました

$content = utf8_encode(file_get_contents('http://example.com/rss.xml'));
$xml = simplexml_load_string($content);
46
Erik

XmlがUTF-8でエンコードされているが、不良文字が含まれていることが確実な場合、この関数を使用して修正できます。

$content = iconv('UTF-8', 'UTF-8//IGNORE', $content);
13
befox

最近、同様の問題が発生し、原因として明らかなものを見つけることができませんでした。文字列には制御文字がありますが、その文字列をブラウザに出力したときその文字は、テキストをIDEにコピーしない限り表示されませんでした。

この投稿 およびこれにより、問題を解決することができました。

preg_replace( '/ [\ x00-\x1F\x7F] /'、 ''、$ input);

5
Paul Blundell

Javascriptを使用する代わりに、次のコード行をmysql_connect文の後に配置できます。

mysql_set_charset('utf8',$connection);

乾杯。

3
Chango

FirefoxでサードパーティのXMLソースを開き、エンコードとして自動検出されるものを確認できますか?たぶん彼らは普通の古いISO-8859-1やUTF-16などを使っているのでしょう。

ただし、UTF-8であると宣言し、他の何かを提供する場合、フィードは明らかに壊れています。このような壊れたフィードを回避することは、私にとって恐ろしいことです(避けられないこともありますが、私は知っています)。

「UTF-8対ISO-8859-1」のような単純な場合は、 mb_detect_encoding() を使用して運を試すこともできます。

2
Pekka 웃

XMLファイルをダウンロードして、たとえばNotepad ++で開くと、エンコードがUTF8以外に設定されていることがわかります。XMLで同じ問題が発生しました。

文字列<?xml version="1.0" encoding="UTF-8"?>ドキュメントのエンコードを設定しないでください。これは、バリデータまたは別のリソースの情報にすぎません。

2
skr

何度か試してみると、htmlentities関数が機能することがわかりました。

$value = htmlentities($value)
1
George John

この問題が発生しました。 XMLファイル(内容ではなく)がutf-8ではなくISO-8859-1でエンコードされていたことが判明しました。 Macでこれを確認するには、file -I xml_filename

Sublimeを使用してファイルエンコーディングをutf-8に変更し、lxmlで問題なくインポートしました。

1
paragbaxi

doctrineを使用してマッピングファイルを生成するとき、私は同じ問題にぶつかりました。いくつかのフィールドがデータベースに持っていたすべてのコメントを削除することで修正しました。

0
Tim Lieberman