DOBON.NET DOBON.NETプログラミング掲示板過去ログ

Unicode文書がUTF-8 / shift_jis でも読める?

環境/言語:[WinXP VB.net]
分類:[.NET]

お世話に成ります。
文字のエンコードデコードに付いてお聞きします。

ユニコードで保存されているテキストファイルを StreamReader で読み込む確認プロジェクトを行っているのですが、Encoding.Unicodeは勿論の事UTF8でもshift_jisでも読めるのです。逆にUTF8で保存したファイルはUTF8でしかデコード出来ません。
本来同じ文字コードでしか読めないと思うのですが何処か間違っているのでしょうか? 其れともそう言う物でしょうか?
テストコード:
Dim fName As String = "D:\temp\unicode.txt"

Dim ec As Encoding = Encoding.GetEncoding("UTF-16")
'Dim ec As Encoding = Encoding.UTF8
'Dim ec As Encoding = Encoding.GetEncoding("shift_jis")

Dim sr As StreamReader = New StreamReader(fName, ec)
Dim line As String
Do
line = sr.ReadLine()
TextBox2.AppendText(line & vbCrLf)
Loop Until line Is Nothing

基本的な質問ですみませんが宜しくお願いします。
次の過去ログの最後にある内容が参考になるかも知れません。

VB6と.NETでのファイルの読み込み
http://dobon.net/vb/bbs/log3-10/5752.html

#emigennさんが扱われた『UTF8で保存したファイル』には BOM が付いてないのではないかと思います。
> ユニコードで保存されているテキストファイルを
具体的にはどのような内容で、文字コードは何でしょうか?
(特に、BOMの有無について確認してみてください)


当方で、実験的に
 『Dim fName As String = "D:\temp\unicode.txt"
 文字のエンコードデコードに付いてお聞きします。』
という2行のテキストを、BOM無しのUTF-16で保存しておき
(ファイルサイズ:140バイト)、提示されたコードで試してみましたが、
やはりEncodingが一致していなければ、化けてしまいました。

 Encoding.GetEncoding("UTF-16")
  →すべて正常に表示された。
 Encoding.UTF8、または Encoding.GetEncoding("shift_jis")
  →先頭の「D」だけが表示された。

ただし、このファイルを、BOM付きにした場合(ファイルサイズ:142バイト)は、
いずれも化けずに表示されました。
こんばんわ、emigenn です。
深山さん、魔界の仮面弁士さん、有難う御座います。

> ユニコードで保存されているテキストファイル
日本語を主体としたアルファベット交じりの手元にあったテキストを、テキストエディターで開き、保存ダイヤログでユニコードを指定して保存しました。
BOM は FF FE が付いていました(リトルエンディアン)

ためしに FF FE を削除したところ "UTF-16" 以外では正常に読み取れませんでした。

>扱われた『UTF8で保存したファイル』には
>BOM が付いてないのではないかと思います。
仰るとおり、BOM の EF BB BF は付いていませんでした。
試しに EF BB BF を追加した所、UTF-8、UTF-16、shift_jis のどれでも正常に読めました。

深山さんの過去ログにある、
>どうやらデータを読み出すときに BOM ありの UTF-16
>(ビッグエンディアン/リトルエンディアン)と
>UTF-8 の三種類に関しては自動判別をしているようでした。
を確認すべく、
TextBox2.AppendText(sr.CurrentEncoding.EncodingName & vbCrLf)
を StreamReader を作った直後と、読み出しが完了した後で実行させてみると、前後で変わっていました。自動判別をしているようです。

今回の皆さんのアドバイスは非常に参考に成りました、
有難う御座いました、又宜しくお願いします。
解決済み!

DOBON.NET | プログラミング道 | プログラミング掲示板