応用情報技術者 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、エンディアン、文字コード判別

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

