XMLエンコーディング宣言 — UTF-8、UTF-16、文字セット

XMLプロローグのエンコーディング宣言を理解します。UTF-8、UTF-16、ISO-8859-1、エンコーディングがパースに与える影響、エンコーディング不一致エラーの修正方法を解説します。

Validation

詳細な説明

XMLエンコーディング宣言

XMLプロローグのエンコーディング宣言は、ドキュメントで使用されている文字エンコーディングをパーサーに伝えます。これを誤ると、文字化け、パース失敗、データ破損につながります。

XMLプロローグ

<?xml version="1.0" encoding="UTF-8"?>
<root>
  <message>Hello, world!</message>
</root>

encoding 属性は文字エンコーディングを指定します。省略された場合、デフォルトでUTF-8が想定されます(BOMが存在する場合はUTF-16)。

一般的なエンコーディング

エンコーディング 説明 用途
UTF-8 可変幅、ASCII互換 現代XMLのデフォルト、Webコンテンツ
UTF-16 固定2バイト(またはサロゲートペア) Windows API、Java内部文字列
ISO-8859-1 西ヨーロッパ、シングルバイト レガシー欧州システム
Shift_JIS 日本語、可変幅 レガシー日本語システム
Windows-1252 Windows西ヨーロッパスーパーセット レガシーWindowsアプリケーション

エンコーディング不一致エラー

最も一般的な問題は、あるエンコーディングを宣言しながらファイルを別のエンコーディングで保存することです:

<!-- ファイルはUTF-8で保存されているが宣言は: -->
<?xml version="1.0" encoding="ISO-8859-1"?>

これにより、パーサーがマルチバイトUTF-8シーケンスをISO-8859-1文字として誤解釈し、非ASCII文字で文字化け(mojibake)が発生します。

エンコーディング問題の修正方法

  1. 実際のファイルエンコーディングを確認 — hexエディタまたは file コマンドを使用
  2. 宣言を実際のエンコーディングに合わせる
  3. 必要に応じてUTF-8に変換iconv などのツールを使用:
    iconv -f ISO-8859-1 -t UTF-8 input.xml > output.xml
    
  4. 宣言を更新encoding="UTF-8" に変更

BOM(バイトオーダーマーク)

UTF-8ファイルは先頭にBOM(EF BB BF)を含む場合があります。有効ですが、一部のXMLパーサーで問題を引き起こすことがあります。UTF-16ファイルはバイトオーダー(ビッグエンディアンまたはリトルエンディアン)を示すためにBOMが必要です。

ベストプラクティス

新しいXMLドキュメントには常にUTF-8を使用してください。普遍的なデフォルトであり、すべての現代パーサーでサポートされ、すべてのUnicode文字を効率的に処理します。

ユースケース

XMLエンコーディングの理解は、国際的なソースからのXMLファイルの処理、非UTF-8エンコーディングを使用するレガシーシステムの移行、複数言語の文字を含むXMLデータフィードの処理、CI/CDパイプラインやAPI統合でのエンコーディングエラーのデバッグに不可欠です。

試してみる — XML Formatter

フルツールを開く