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
上記の段落のダムダウンの説明はありますか?
次のような行を使用する必要があります
<?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を使用していますが、 Frhed のような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がなければ、推測する必要があります。