XML ファイルから PHP ファイルに特定の文字を読み取るときに問題が発生します。
「ä」、「ü」、「ö」などの文字を使用します。次のエラーが表示されます。
simplexml_load_string() [function.simplexml-load-string]: エンティティ: 96 行目: パーサー エラー: 入力が適切な UTF-8 ではありません。エンコーディングを示してください ! バイト: 0xFC 0x73 0x65 0x0C
XML ファイルから PHP ファイルに特定の文字を読み取るときに問題が発生します。
「ä」、「ü」、「ö」などの文字を使用します。次のエラーが表示されます。
simplexml_load_string() [function.simplexml-load-string]: エンティティ: 96 行目: パーサー エラー: 入力が適切な UTF-8 ではありません。エンコーディングを示してください ! バイト: 0xFC 0x73 0x65 0x0C
取得した XML の文字列が正しくエンコードされていません。ただし、デフォルトのエンコーディングはUTF-8
、取得した文字列が異なり、おそらくWindows-1252
.
そのエラーを解消したい場合は、その文字列を(質問の情報が不足しているため)不明なエンコーディングからUTF-8に再エンコードする必要があります。
エンコーディングが不明な場合は壊れているため、最初に文字列のエンコーディングを調べて学習する必要があります。
次に、それを UTF-8 に変換するか、エンコーディングを XML 文字列に挿入することができます。これはXMLRecoder
、XML 宣言と BOM に基づいて XML ドキュメントの文字エンコーディングを検査および変更することで簡単に実行できます。その一部はPHP XMLReader で説明されており、XMLReader に関するバージョンとエンコーディングを取得しますが、SimpleXML と同様に、libxml ベースの PHP XML 拡張機能でもあり、いくつかの共通点を共有しているため、これは機能します。
使用例:
$buffer = file_get_contents($file);
$fromEncoding = 'WINDOWS-1252'; # insert *your* correct string encoding here
$recoder = new XMLRecoder();
$buffer = $recoder->setEncodingDeclaration($buffer, $fromEncoding);
$sxml = simplexml_load_string($buffer);
PHP での XML エンコーディングと、利用可能な文字セット エンコーディングと名前をよりよく理解するには、以下を参照してください。
PHP 5 以前のバージョンには、ネイティブ Unicode サポートがありません。Unicode のサポートが約束されている PHP 6 または 7 には、何年もかかる可能性があります。このギャップを埋めるために、mbstring、iconv、intl などのいくつかの拡張機能が存在します。
適切なコンテンツ タイプとエンコーディングを使用して HTML 応答を送信するようにしてください。
<?php header('Content-Type: text/html; charset=utf-8');?>
また、XML ファイルのプロローグに適切なエンコーディングが含まれていることも確認してください。
<?xml version="1.0" encoding="UTF-8"?>
それがすべて正しいと仮定すると、xml ファイルは UTF-8 であると主張しているように見えますが、実際には別のものです (おそらく latin1 または ISO-8859-1 またはMojibake .)。お気に入りのエディター (私はSublimeが好きです) で XML ファイルを手動で開き、ファイルを UTF8 エンコーディングで明示的に保存できます。または、関数を使用して、ロードする前に文字列の変更を試みることができます。エラー: 「入力が適切な UTF-8 ではありません。エンコーディングを指定してください!」PHP の simplexml_load_string を使用する
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]);
}
しかし、最終的には面倒なことになり、PHP はまだ Unicode を私たちが望んでいるほどには処理していないように見えます。また、単にコアに組み込まれていないだけです。
Portable UTF-8 - a Lightweight Library for Unicode Handling in PHPを確認することをお勧めします。