タイトル | : Re^2: ファイルからエンコードを判定 |
記事No | : 10572 |
投稿日 | : 2011/07/27(Wed) 15:32 |
投稿者 | : 魔界の仮面弁士 |
> (1) ファイル先頭に、GetPreamble メソッドに合致する BOM があるか調べる。 > → 合致した場合、ほぼ間違いなく、そのエンコードであると確定する。 (中略) > さらに言えば、Unicode 先頭の BOM についても、厳密に言えば > 必ずしも確実な手段とは言い切れなかったりします。
上記について補足。
[RFC2781: UTF-16, an encoding of ISO 10646] http://www.akanko.net/marimo/data/rfc/rfc2781-jp.txt
上記によると、UTF-16 の符号化は、下記の 3 種類で示されるようです。 (1) UTF-16BE (2) UTF-16LE (3) UTF-16
これらと BOM (バイト順序マーク)の関連性を見てみると、 ≪BOM を付与しない≫ ……… (1), (2) ≪BOM を付与しても良い≫ … (3) という違いがあります。
BOM の有無まで考慮すれば、(3) はさらに (3.1) UTF-16のBOMなし (3.2) UTF-16のビッグエンディアンなBOM付き (3.3) UTF-16のリトルエンディアンなBOM付き に分かれます。合計 5 種類ですね。
さてここで、バイナリの内容が (a) 00 41 00 42 00 43 FE FF (b) 41 00 42 00 43 00 FF FE (c) FE FF 00 41 00 42 00 43 FE FF (d) FF FE 41 00 42 00 43 00 FF FE で表される 4 つのテキストファイルがあったとします。
これらを上記の 5 種類でデコードする場合、 ◎ 4文字のデータ "ABC" & ZWNBSP ☆ 5文字のデータ ZWNBSP & "ABC" & ZWNBSP × 変換エラー の 3 パターンいずれかになります。
なお、上記にある ZWNBSP というのは不可視文字であり、 VB.NET では「Dim ZWNBSP As Char = ChrW(&HFEFF)」に相当します。
┌──┰─┬─┬─┬─┐ │ ┃ a│ b│ c│ d│ ┝━━╋━┿━┿━┿━┥ │ 1 ┃◎│×│☆│×│UTF-16BE ├──╂─┼─┼─┼─┤ │ 2 ┃×│◎│×│☆│UTF-16LE ├──╂─┼─┼─┼─┤ │ 3.1┃◎│×│☆│☆│UTF-16(BOMなし) ├──╂─┼─┼─┼─┤ │ 3.2┃?│?│◎│×│UTF-16(ビッグエンディアンなBOM付き) ├──╂─┼─┼─┼─┤ │ 3.3┃?│?│×│◎│UTF-16(リトルエンディアンなBOM付き) └──┸─┴─┴─┴─┘
?が付いているのは、BOM 付きとなっているのに先頭が BOM では無い組み合わせです。 (ある意味では変換エラーなので、× と同様に扱っても良いですが)
|