エラーが発生しています:
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ファイルの正しいエンコードを検出する方法はありますか?
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]);
}
私はこれを使用して解決しました
$content = utf8_encode(file_get_contents('http://example.com/rss.xml'));
$xml = simplexml_load_string($content);
XmlがUTF-8でエンコードされているが、不良文字が含まれていることが確実な場合、この関数を使用して修正できます。
$content = iconv('UTF-8', 'UTF-8//IGNORE', $content);
最近、同様の問題が発生し、原因として明らかなものを見つけることができませんでした。文字列には制御文字がありますが、その文字列をブラウザに出力したときその文字は、テキストをIDEにコピーしない限り表示されませんでした。
この投稿 およびこれにより、問題を解決することができました。
preg_replace( '/ [\ x00-\x1F\x7F] /'、 ''、$ input);
Javascriptを使用する代わりに、次のコード行をmysql_connect文の後に配置できます。
mysql_set_charset('utf8',$connection);
乾杯。
FirefoxでサードパーティのXMLソースを開き、エンコードとして自動検出されるものを確認できますか?たぶん彼らは普通の古いISO-8859-1やUTF-16などを使っているのでしょう。
ただし、UTF-8であると宣言し、他の何かを提供する場合、フィードは明らかに壊れています。このような壊れたフィードを回避することは、私にとって恐ろしいことです(避けられないこともありますが、私は知っています)。
「UTF-8対ISO-8859-1」のような単純な場合は、 mb_detect_encoding() を使用して運を試すこともできます。
XMLファイルをダウンロードして、たとえばNotepad ++で開くと、エンコードがUTF8以外に設定されていることがわかります。XMLで同じ問題が発生しました。
文字列<?xml version="1.0" encoding="UTF-8"?>
ドキュメントのエンコードを設定しないでください。これは、バリデータまたは別のリソースの情報にすぎません。
何度か試してみると、htmlentities関数が機能することがわかりました。
$value = htmlentities($value)
この問題が発生しました。 XMLファイル(内容ではなく)がutf-8ではなくISO-8859-1でエンコードされていたことが判明しました。 Macでこれを確認するには、file -I xml_filename
。
Sublimeを使用してファイルエンコーディングをutf-8に変更し、lxmlで問題なくインポートしました。
doctrineを使用してマッピングファイルを生成するとき、私は同じ問題にぶつかりました。いくつかのフィールドがデータベースに持っていたすべてのコメントを削除することで修正しました。