web-dev-qa-db-ja.com

XMLのデフォルトのエンコーディングはUTF-8またはUTF-16ですか?

OpenTag FAQ 状態:

XMLドキュメントにエンコーディング宣言が存在しない場合(およびHTTPヘッダーなどの外部エンコーディング宣言メカニズムが利用できない場合)、XMLドキュメントの想定されるエンコーディングは、バイトオーダーマーク(BOM)の存在に依存します。

BOMは、ファイルの先頭に配置され、エンコードを示すUnicodeの特別なマーカーです。 BOMはUTF-8ではオプションです。

First bytes        Encoding assumed
-----------------------------------------
EF BB BF           UTF-8
FE FF              UTF-16 (big-endian)
FF FE              UTF-16 (little-endian)
00 00 FE FF        UTF-32 (big-endian)
FF FE 00 00        UTF-32 (little-endian)
None of the above  UTF-8

上記の段落のダムダウンの説明はありますか?

17
Pacerier

次のような行を使用する必要があります

<?xml version="1.0" encoding="iso-8859-1" ?>

使用するエンコーディングを指定します。エンコーディングが指定されていない場合、 バイトオーダーマーク(BOM) が存在する可能性があります。 UTF-16またはUTF-32のいずれかのBOMが存在する場合、そのエンコーディングが使用されます。それ以外の場合は、UTF-8がエンコーディングです。 (UTF-8のBOMはオプションです)

編集

BOMは目に見えない文字です。しかし、それを見る必要はありません。アプリケーションが自動的に処理します。 Windowsのメモ帳を使用する場合は、ファイルを保存するときにエンコードを選択できます。メモ帳は、ファイルの先頭にBOMを自動的に挿入します。後でファイルを再度開くと、メモ帳はBOMを認識し、適切なエンコーディングを使用してファイルを読み取ります。 BOMを変更する必要はありません。変更すると、文字の意味が異なる可能性があるため、テキストは同じになりません。

例を挙げて説明しようと思います。 「test」という文字だけを含むテキストファイルについて考えてみます。デフォルトのメモ帳はANSIエンコーディングを使用します。テキストファイルを 16進モード で表示すると、次のようになります。

C:\>C:\gnuwin32\bin\hexdump -C test-ansi.txt
00000000  74 65 73 74                                       |test|
00000004

(ご覧のとおり、私はgnuwin32のhexdumpを使用していますが、 Frh​​ed のような16進エディターを使用してこれを確認することもできます。

このファイルの前にBOMはありません。 BOMに使用される文字がANSIエンコーディングに存在しないため、これは不可能です。 (BOMがないため、ANSIエンコーディングをサポートしないエディターは、このファイルをUTF-8として扱います)。

utf8のようにファイルを保存すると、「test」の前に3バイト(BOM)が追加されます。

C:\>C:\gnuwin32\bin\hexdump -C test-utf8.txt
00000000  ef bb bf 74 65 73 74                              |test|
00000007

(utf-8をサポートしていないテキストエディタでこのファイルを開くと、実際にはこれらの文字「ï"¿」が表示されます)

メモ帳はファイルをUnicodeとして保存することもできます。これは、UTF-16リトルエンディアン(UTF-16LE)を意味します。

C:\>C:\gnuwin32\bin\hexdump -C test-unicode.txt
00000000  ff fe 74 00 65 00 73 00  74 00                    |ÿþt.e.s.t.|
0000000a

そして、これがユニコード(ビッグエンディアン)(UTF-16BE)として保存されたバージョンです:

C:\>C:\gnuwin32\bin\hexdump -C test-unicode-big-endian.txt
00000000  fe ff 00 74 00 65 00 73  00 74                    |þÿ.t.e.s.t|
0000000a

ここで、4つの漢字「琀攀猀琀」を含むテキストファイルについて考えてみます。これをUnicode(ビッグエンディアン)として保存すると、結果は次のようになります。

C:\>C:\gnuwin32\bin\hexdump -C test2-unicode-big-endian.txt
00000000  fe ff 74 00 65 00 73 00  74 00                    |þÿt.e.s.t.|
0000000a

ご覧のとおり、UTF-16LEの「test」という単語は、UTF-16BEの「琀攀猀琀」という単語と同じ方法で保存されます。ただし、BOMが異なる方法で保存されているため、ファイルに「test」または「琀攀猀琀」が含まれているかどうかを確認できます。 BOMがなければ、推測する必要があります。

29