応用情報技術者 2022年 秋期 午前2 問07
問題文
XMLにおいて、XML宣言中で符号化宣言を省略できる文字コードはどれか。
選択肢
ア:EUC-JP
イ:ISO-2022-JP
ウ:Shift-JIS
エ:UTF-16(正解)
🔒 解説は解答すると表示されます
XMLの符号化判別【午前2解説】
正解の理由
XML文書の符号化宣言は、パーサが文書のバイト列から文字エンコーディングを確定できる場合に省略できます。標準で自動判別が可能なのは主にUTF-8とUTF-16の系統であり、提示された選択肢のうちその条件を満たすのは エ(UTF-16)だけです。
UTF-16はBOMによってエンディアン(BE/LE)を示すことができ、BOMがない場合でも先頭のバイト列("<?xml" に相当するバイトパターン)からBE/LEを判別できるため、符号化宣言を省略できる場合があります。なお、BOMは有用ですが必須ではありません(BOMがなくても先頭バイト列で判別可能な場合があります)。一方、EUC-JP、ISO-2022-JP、Shift_JISは先頭バイト列だけではUTF系と区別できないため、宣言や外部情報が必要です。
UTF-16はBOMによってエンディアン(BE/LE)を示すことができ、BOMがない場合でも先頭のバイト列("<?xml" に相当するバイトパターン)からBE/LEを判別できるため、符号化宣言を省略できる場合があります。なお、BOMは有用ですが必須ではありません(BOMがなくても先頭バイト列で判別可能な場合があります)。一方、EUC-JP、ISO-2022-JP、Shift_JISは先頭バイト列だけではUTF系と区別できないため、宣言や外部情報が必要です。
解法ステップ
- 問題が尋ねる「符号化宣言を省略できる条件」をXMLの仕様に当てはめる。
- XML仕様では自動判別が可能なエンコーディングとしてUTF-8/UTF-16系が挙げられることを思い出す。
- 選択肢を照合し、UTF系に該当するもの(この場合はUTF-16)が条件を満たすと判断する。
- BOMの有無や先頭バイト列による判別方法を確認して、宣言が必須ではない旨を補足説明する。
選択肢別の誤答解説
- ア: EUC-JP
- 誤り。EUC-JPは先頭バイト列から一意にXMLのASCII部分("<?xml")と判別できず、外部のメタ情報やXML宣言が必要になる。
- イ: ISO-2022-JP
- 誤り。エスケープシーケンスを多用する可変長エンコーディングであり、自動判別できないため符号化宣言が必要。
- ウ: Shift-JIS
- 誤り。Shift_JISも先頭バイト列でUTF系と区別がつかない場合があり、自動判別は期待できない。
- エ: UTF-16
- 正答。XMLパーサはBOMや先頭のバイトパターンからUTF-16(BE/LE)を判別できるため、符号化宣言を省略できる場合がある。BOMは判別に便利だが必須ではない点に注意する。
よくある誤解
- BOMが必須だと思い込む
- 誤り。BOMは判別を容易にするが、XMLパーサは先頭のバイトパターン("<?xml" のバイト列)でもUTF-16/UTF-8を判別できるため、必ずしも必須ではありません。
- 「UTF-8は必ず宣言不要」と単純化する
- 実務ではUTF-8を使えば宣言を省略して問題ないことが多いが、配信プロトコル(HTTPヘッダ等)やファイルの扱いによっては明示したほうが安全です。
- 外部のMIME/HTTPヘッダとの扱いを無視する
- 実際の受け渡しではプロトコル側の文字セット情報が影響するため、宣言だけに頼るのは危険です。
補足コラム
- XMLの実際の検出例(先頭バイト):
- UTF-8の先頭は通常3C 3F 78 6D ...("< ? x m ...")
- UTF-16BEの先頭は00 3C 00 3F 00 78 00 6D ...(NUL '<' NUL '?' ...)
- UTF-16LEの先頭は3C 00 3F 00 78 00 6D 00 ...('<' NUL '?' NUL ...)
- これらのパターンに基づき、BOMがない場合でもBE/LE判別が可能です。例(16進表記):
UTF-8: 3C 3F 78 6D 6C ... UTF-16BE: 00 3C 00 3F 00 78 00 6D ... UTF-16LE: 3C 00 3F 00 78 00 6D 00 ...
- 実務上の勧め:他システムとのやり取りや可搬性を考えると、可能であればUTF-8を使用し、必要に応じてXML宣言(encoding属性)を明示するのが安全です。非UTF系(EUC-JP等)を使う場合は必ず宣言するか、プロトコル側で確実に文字コードを指定してください。
- XML宣言の例:
FAQ
Q: BOMがあれば必ず符号化宣言を省略して良いですか?
A: BOMがあればエンディアンやUTF-16の判別は容易になりますが、配信経路(例:HTTPのContent-Type)や利用するパーサの仕様に依存するため、完全に安全とは言えません。BOMは有用ですが必須ではなく、明示宣言が安全です。
A: BOMがあればエンディアンやUTF-16の判別は容易になりますが、配信経路(例:HTTPのContent-Type)や利用するパーサの仕様に依存するため、完全に安全とは言えません。BOMは有用ですが必須ではなく、明示宣言が安全です。
Q: UTF-8は問題の選択肢にないが、UTF-8も省略可能ですか?
A: はい。UTF-8もXMLの自動判別が可能な代表的なエンコーディングで、通常は宣言を省略できます。ただし本文中の選択肢の中では該当がないためUTF-16を選びます(エ)。
A: はい。UTF-8もXMLの自動判別が可能な代表的なエンコーディングで、通常は宣言を省略できます。ただし本文中の選択肢の中では該当がないためUTF-16を選びます(エ)。
Q: HTTPヘッダで指定された文字コードとXML宣言が矛盾した場合はどうなりますか?
A: 通常は転送プロトコル(HTTP)の指定が優先される実装が多く、その結果XML宣言と矛盾するとエラー扱いになることがあります。配布方法に応じて一貫した指定を心がけてください。
A: 通常は転送プロトコル(HTTP)の指定が優先される実装が多く、その結果XML宣言と矛盾するとエラー扱いになることがあります。配布方法に応じて一貫した指定を心がけてください。
関連キーワード: XML、BOM、符号化宣言、UTF-16、UTF-8、Shift_JIS、EUC-JP、ISO-2022-JP、エンディアン、文字コード判別

\ せっかくなら /
応用情報技術者を
クイズ形式で学習しませんか?
クイズ画面へ遷移する→
すぐに利用可能!

