【PHP8.x】encodingプロパティの使い方

encodingプロパティの使い方について、初心者にもわかりやすく解説します。

作成日: 更新日:

基本的な使い方

『encodingプロパティは、DOMDocumentオブジェクトが扱うドキュメントのエンコーディング(文字コード)を保持するプロパティです。このプロパティは、ドキュメントの文字エンコーディングを取得したり、設定したりするために使用されます。loadXML()loadHTML()メソッドを使ってXMLやHTMLファイルを読み込むと、そのファイル内で指定されているエンコーディング、例えばXML宣言のencoding属性の値などがこのプロパティに自動的に格納されます。これにより、現在操作しているドキュメントがどのエンコーディングで記述されているかを確認できます。逆に、このプロパティに新しいエンコーディング名(例: 'Shift_JIS')を代入することで、ドキュメントを保存する際のエンコーディングを指定することが可能です。saveXML()saveHTML()メソッドでドキュメントをファイルや文字列として出力する際には、このプロパティに設定された値がXML宣言に反映されます。ただし、このプロパティは主に出力時のエンコーディングを指定するためのものであり、オブジェクトが内部で保持しているデータの文字エンコーディングそのものを変換するわけではない点に注意が必要です。ドキュメントにエンコーディングの指定がない場合、このプロパティはnullを返すことがあります。

構文(syntax)

1<?php
2
3// DOMDocumentオブジェクトを作成します
4$dom = new DOMDocument();
5
6// encodingプロパティにドキュメントのエンコーディングを設定します
7$dom->encoding = 'UTF-8';
8
9// encodingプロパティから設定されたエンコーディングを取得します
10$encodingValue = $dom->encoding;
11
12// 取得した値を表示します
13echo $encodingValue; // "UTF-8" が出力されます

引数(parameters)

引数なし

引数はありません

戻り値(return)

string|null

DOMDocumentオブジェクトがXMLドキュメントのエンコーディングとして設定されている文字列、または設定されていない場合はnullを返します。

サンプルコード

PHP DOMDocument::encoding でXMLエンコーディングを取得する

1<?php
2
3/**
4 * DOMDocument::encoding プロパティの使用方法を示すサンプルコードです。
5 * XMLドキュメントからエンコーディング情報を取得する方法を実演します。
6 *
7 * @param string $xmlContent 処理するXMLコンテンツ文字列
8 * @return void
9 */
10function getXmlEncoding(string $xmlContent): void
11{
12    echo "--- 処理対象のXMLコンテンツ ---" . PHP_EOL;
13    echo $xmlContent . PHP_EOL;
14    echo "---------------------------" . PHP_EOL;
15
16    $dom = new DOMDocument();
17    
18    // XMLパーサーのエラーを内部的に処理し、警告が出ないように設定します。
19    // これにより、不正なXMLでもスクリプトが停止せず、エラー情報を取得できます。
20    libxml_use_internal_errors(true);
21    
22    // XMLコンテンツをDOMDocumentにロードします。
23    // loadXML() は、XML宣言のエンコーディング情報を解析します。
24    if ($dom->loadXML($xmlContent)) {
25        // DOMDocument::encoding プロパティは、XML宣言で指定されたエンコーディングを返します。
26        // 例えば、`<?xml version="1.0" encoding="UTF-8"?>` の "UTF-8" 部分です。
27        // エンコーディング宣言がないXMLの場合、このプロパティは null を返します。
28        $encoding = $dom->encoding;
29
30        echo "DOMDocument::encoding プロパティの値: ";
31        if ($encoding === null) {
32            echo "null (XML宣言にエンコーディングが指定されていません)";
33        } else {
34            echo $encoding;
35        }
36        echo PHP_EOL . PHP_EOL;
37    } else {
38        echo "XMLコンテンツのロードに失敗しました。" . PHP_EOL;
39        // ロード失敗時のエラーメッセージを表示します。
40        foreach (libxml_get_errors() as $error) {
41            echo "  エラー: " . $error->message;
42        }
43        echo PHP_EOL . PHP_EOL;
44    }
45    
46    // エラー情報をクリアし、XMLパーサーのエラー処理を元の設定に戻します。
47    libxml_clear_errors();
48    libxml_use_internal_errors(false);
49}
50
51// 例1: UTF-8 エンコーディングが明示されたXML
52$xmlString1 = '<?xml version="1.0" encoding="UTF-8"?>
53<data>
54    <message>こんにちは、世界!</message>
55</data>';
56getXmlEncoding($xmlString1);
57
58// 例2: Shift_JIS エンコーディングが明示されたXML
59// 注意: このプロパティはXML宣言の内容を返します。
60// PHPの文字列エンコーディングとXML宣言が一致しない場合でも、
61// 宣言されたエンコーディングが返されます。
62$xmlString2 = '<?xml version="1.0" encoding="Shift_JIS"?>
63<data>
64    <message>PHPは素晴らしい</message>
65</data>';
66getXmlEncoding($xmlString2);
67
68// 例3: エンコーディング宣言がないXML
69// この場合、DOMDocument::encoding プロパティは null を返します。
70$xmlString3 = '<data><message>No encoding declared</message></data>';
71getXmlEncoding($xmlString3);
72
73// 例4: 不正なXMLコンテンツ (閉じタグの不足)
74// ロードに失敗し、エラーメッセージが表示されます。
75$invalidXmlString = '<data><message>Missing closing tag</data>';
76getXmlEncoding($invalidXmlString);
77

PHPのDOMDocument::encodingプロパティは、XMLドキュメントのエンコーディング情報を取得するために使用します。このプロパティは、XML宣言(例: <?xml version="1.0" encoding="UTF-8"?>)で指定されたエンコーディング属性の値(この例では「UTF-8」)を文字列として返します。もしXML宣言にエンコーディングの指定がない場合は、nullを返します。

提供されたサンプルコードでは、getXmlEncoding関数がXMLコンテンツ文字列を引数として受け取り、そのエンコーディング情報を抽出し表示する方法を示しています。まず、DOMDocumentオブジェクトを生成し、libxml_use_internal_errors(true)を設定することで、XMLパースエラー発生時にスクリプトが停止せず、エラー情報を確認できるようにしています。次に、loadXML()メソッドでXMLコンテンツを読み込み、成功すれば$dom->encodingからエンコーディング情報を取得します。取得した値がnullであれば「エンコーディングが指定されていません」と表示し、そうでなければそのエンコーディング文字列を表示します。

このプロパティの戻り値は、XML宣言に指定されたエンコーディングを示すstring型、またはエンコーディングが宣言されていない場合のnullです。これにより、XMLデータ処理において、ドキュメントがどのような文字コードで書かれているかを正確に把握し、適切な処理を行うための基礎情報として活用できます。

DOMDocument::encodingプロパティは、XML宣言に記述されたエンコーディング情報(例: <?xml ... encoding="UTF-8"?>"UTF-8" 部分)を取得します。XML宣言にエンコーディングが指定されていない場合、このプロパティは null を返しますので、値を利用する際は必ず null チェックを行ってください。

このプロパティは、loadXML()などでXMLがDOMDocumentオブジェクトに正常にロードされた後に有効な値を提供します。不正なXMLコンテンツを処理する際は、libxml_use_internal_errors(true) を使用してエラーを内部的に処理し、libxml_get_errors() でエラー内容を確認するエラーハンドリングを導入すると、スクリプトの予期せぬ停止を防ぎ、問題解決に役立ちます。

また、このプロパティが示すエンコーディングはXMLドキュメント自体の情報であり、PHPスクリプトが内部的に扱う文字列のエンコーディングとは異なる場合がある点に注意してください。

PHP DOMDocument encodingプロパティでUTF-8を取得する

1<?php
2
3/**
4 * DOMDocument の encoding プロパティの利用例。
5 * UTF-8 エンコーディングを持つXMLを読み込み、そのエンコーディングを確認します。
6 *
7 * @return void
8 */
9function demonstrateDomDocumentEncoding(): void
10{
11    // UTF-8 エンコーディングを持つシンプルなXML文字列を定義します。
12    // XML宣言 (<?xml ... ?>) で encoding="UTF-8" と明示的に指定しています。
13    $xmlString = '<?xml version="1.0" encoding="UTF-8"?>
14<root>
15    <item>これは日本語のテキストです。</item>
16    <item>他の文字コードでも、適切に処理されます。</item>
17</root>';
18
19    // DOMDocument オブジェクトを作成します。
20    // このオブジェクトはXML文書全体を表現し、その内容を操作できます。
21    $dom = new DOMDocument();
22
23    // XML文字列をDOMDocumentオブジェクトに読み込みます。
24    // loadXML() メソッドは、XML宣言に指定されたエンコーディングを自動的に検出し、
25    // DOMDocument オブジェクトの encoding プロパティにその値をセットします。
26    if (!$dom->loadXML($xmlString)) {
27        echo "XMLの読み込みに失敗しました。\n";
28        return;
29    }
30
31    // DOMDocument オブジェクトから encoding プロパティの値を取得します。
32    // このプロパティは、XML宣言で指定されたエンコーディング(または自動検出されたエンコーディング)を返します。
33    // XMLが適切にパースされていない場合や、エンコーディングが不明な場合は null を返す可能性があります。
34    $detectedEncoding = $dom->encoding;
35
36    // 検出されたエンコーディングを表示します。
37    // null の場合は「未検出」と表示し、初心者にも分かりやすくします。
38    echo "検出されたエンコーディング: " . ($detectedEncoding ?? '未検出') . "\n";
39
40    // キーワードに関連するUTF-8エンコーディングであることを確認します。
41    if ($detectedEncoding === 'UTF-8') {
42        echo "エンコーディングは期待通りUTF-8です。\n";
43    } else {
44        echo "エンコーディングがUTF-8ではありません。検出された値: " . ($detectedEncoding ?? 'null') . "\n";
45    }
46}
47
48// 上記の関数を実行して、DOMDocument::encoding プロパティの動作を確認します。
49demonstrateDomDocumentEncoding();
50

PHPのDOMDocumentクラスは、XML文書をオブジェクトとして扱い、その内容を操作するための機能を提供します。このクラスのencodingプロパティは、DOMDocumentオブジェクトに読み込まれたXML文書がどのような文字コード(エンコーディング)で記述されているかを取得するために使用されます。

このプロパティは引数を必要とせず、XML文書をloadXML()load()といったメソッドで読み込んだ際に、XML宣言(例: <?xml version="1.0" encoding="UTF-8"?>)に明示されているエンコーディングを自動的に解析し、その文字列値を返します。例えば、XMLがUTF-8で記述されていれば、このプロパティは"UTF-8"という文字列を返します。ただし、XMLの読み込みが正常に行われなかった場合や、エンコーディング情報がXML内で特定できない場合は、nullが返されることがあります。

サンプルコードでは、明示的にUTF-8エンコーディングを指定したXML文字列をDOMDocumentに読み込ませ、$dom->encodingを通じてそのエンコーディングが正しく"UTF-8"として検出される過程を示しています。このプロパティを利用することで、PHPでXML文書を扱う際に、その文字コードが期待通りであるかを確認でき、特に多言語対応や外部システム連携において、文字化けといったトラブルを防ぐ上で非常に重要な役割を果たします。

DOMDocument::encoding プロパティは、XML宣言で指定されたエンコーディングを読み取るためのものです。XMLが正しく読み込まれると、このプロパティにそのエンコーディングがセットされますが、XMLの読み込みに失敗した場合やエンコーディングが検出できない場合はnullを返します。そのため、サンプルコードのようにnullチェックを行い、未検出の場合の処理を記述することが重要です。

このプロパティは読み取り専用であり、このプロパティに値を代入しても、XML文書自体のエンコーディングが変更されるわけではありません。XMLのエンコーディングを変更したい場合は、XMLコンテンツを別のエンコーディングで再生成する必要があります。また、PHPスクリプトの内部エンコーディングとXML文書のエンコーディングは別物として扱われる点にご注意ください。

関連コンテンツ

関連プログラミング言語

【PHP8.x】encodingプロパティの使い方 | いっしー@Webエンジニア