PHPのXML_PARSE()関数を使用してXMLデータを解析する場合、XMLがUTF-8エンコードされていて不適切に処理されている場合、Carledコンテンツが解析されている可能性があります。この問題は、XMLファイルヘッダーがUTF-8エンコーディングを宣言する場合に一般的ですが、エンコードは実際の読み取りまたは処理中に正しく認識または変換されません。この記事では、問題の原因を紹介し、特定のソリューションを提供します。
XML_PARSE()は、PHPのExpat Parserへのインターフェイスです。 Expat自体は、キャラクターエンコーディングで非常に厳格であり、入力XML文字列エンコードは、特にUTF-8を明確かつ一貫している必要があります。提供されたXMLデータがUTF-8と宣言されているが、そうではない場合、またはPHPがこれらのデータを処理するときに変換を誤ってエンコードする場合、Carled Codeが表示されます。
別の一般的な問題は、XMLファイルを外部から読み取るとき(URL経由でフェッチするなど)、適切なストリームエンコードがUTF-8に設定または変換されないため、一貫性のないエンコードが発生することです。
<?php
$xml = file_get_contents("https://m66.net/data/sample.xml");
$parser = xml_parser_create(); // デフォルトで使用されます ISO-8859-1
xml_parse($parser, $xml, true);
echo "成功した分析";
xml_parser_free($parser);
?>
上記のコードを実行できますが、 sample.xmlがUTF-8エンコードされている場合、パージング中に文字化けしたコードを引き起こしたり、直接失敗したりする可能性があります。
XML_PARSER_CREATE()のパラメーターを使用して、EncodingをUTF-8として指定して、パーサーに正しいエンコードを使用するように指示できます。
<?php
$xml = file_get_contents("https://m66.net/data/sample.xml");
$parser = xml_parser_create('UTF-8'); // 明示的に指定します UTF-8
xml_parser_set_option($parser, XML_OPTION_TARGET_ENCODING, 'UTF-8');
xml_parse($parser, $xml, true);
echo "成功した分析";
xml_parser_free($parser);
?>
この方法により、パーサーはUTF-8に従ってデータを読み取り、中国語またはその他のマルチビート文字を含むXMLコンテンツを正しく処理できます。
外部ソース(インターフェイスやリモートXMLファイルなど)から取得したデータが本当にUTF-8であるかどうかがわからない場合は、 MB_DETECT_ENCODING()またはICONV()を使用して確認または変換できます。
<?php
$xml = file_get_contents("https://m66.net/data/sample.xml");
// 検出して変換します UTF-8
if (mb_detect_encoding($xml, 'UTF-8', true) === false) {
$xml = iconv('GBK', 'UTF-8', $xml); // 必要に応じて元のエンコードを変更します
}
$parser = xml_parser_create('UTF-8');
xml_parser_set_option($parser, XML_OPTION_TARGET_ENCODING, 'UTF-8');
xml_parse($parser, $xml, true);
echo "成功した分析";
xml_parser_free($parser);
?>
これにより、特にサードパーティのプラットフォームや異なるシステムからのデータを扱う場合、一貫性のないエンコードの問題を回避できます。
XMLファイルのヘッダー宣言に次のコンテンツが含まれているかどうかを確認します。
<?xml version="1.0" encoding="UTF-8"?>
UTF-8が宣言されているが、実際のエンコードがUTF-8ではない場合、たとえPHPで解析を余儀なくされたとしても、文字化けコードまたは解析障害が発生する可能性があります。この時点で、ソースファイルエンコードを最初に修正するか、PHPを使用して変換する必要があります。
関連タグ:
xml_parse