XMLとJSON変換における文字エンコーディング
XMLとJSON間の文字エンコーディングの違いを処理する方法。UTF-8、UTF-16、XMLエンティティ参照、変換時の正確な文字保持について解説します。
Advanced
詳細な説明
文字エンコーディングはXMLとJSONで異なる扱いを受けるため、変換時のミスマッチはデータ破損を引き起こす可能性があります。
XMLのエンコーディングの柔軟性:
XMLは複数の文字エンコーディングをサポートし、XML宣言で宣言します:
<?xml version="1.0" encoding="UTF-8"?>
<?xml version="1.0" encoding="UTF-16"?>
<?xml version="1.0" encoding="ISO-8859-1"?>
<?xml version="1.0" encoding="Shift_JIS"?>
JSONのエンコーディングは常にUTF-8。 RFC 8259に従い、システム間で交換されるJSONテキストはUTF-8でエンコードする必要があります。エンコーディング宣言は不要であり、記述もできません。
XML文字参照:
XMLは数値参照を使って文字を表現できます:
<text>Café — a nice place</text>
JSONでは、これらは実際のUnicode文字になります。
XMLの定義済みエンティティ:
XMLには要素コンテンツと属性値でエスケープが必要な5つの定義済みエンティティ参照があります:
| エンティティ | 文字 | JSON等価物 |
|---|---|---|
< |
< |
<(直接) |
> |
> |
>(直接) |
& |
& |
&(直接) |
" |
" |
\"(エスケープ) |
' |
' |
'(直接) |
変換の考慮事項:
- XMLからJSON: すべてのエンティティ参照と文字参照を実際の文字にデコードします。JSON出力にはXMLエスケープシーケンスではなく実際の文字を含めるべきです。
- JSONからXML: エンティティ参照またはCDATAセクションを使って特殊文字をエスケープします。少なくとも
<、>、&はテキストコンテンツでエスケープが必要です。 - BMPの範囲外の文字(絵文字、CJK拡張)は両形式で有効ですが、JSONではサロゲートペア、XMLでは数値参照が必要な場合があります。
ベストプラクティス: 変換時は常にUTF-8に正規化してください。ソースXMLが非UTF-8エンコーディングを使用している場合、パース前にバイトをUTF-8にトランスコードしてください。
ユースケース
Shift_JISエンコーディングを使用する日本のレガシーシステムのXMLドキュメントをモダンなWebアプリケーション用のUTF-8 JSONに変換し、すべての漢字が正しく保持されることを確認する場合。