misc.log

日常茶飯事とお仕事と

Shift_JISとUNICODE、VB.NET

別の仕事で、文字コードに関する質問が出ていたので調べる。外字を含んだShift_JISのデータを、果たしてVB.NETは問題なく処理できるのか?という疑問。いや、こんなことはたぶんわかってる人には当たり前なんだろうけど、わからない人にはわからないわけよ。
というわけでやってみる。まず、外字を作る。外字なんて作ったこと無いよ!というわけで作ったのが上の画像*1
これを含んだShift_JISファイルを読み込んで表示ができるか、また、表示したものを元のShift_JISで書き出せるかという実験。結果からいうと、問題なし(問題あったら大問題だよな)。ただ、Shift_JISのものを普通に読んでしまうとやはり化けるので、読み込むときに変換をかけてやる必要があるらしい。

Dim stream As FileStream
Dim Buffer(1024) As Byte
Dim StrBuilder As New StringBuilder

stream = File.OpenRead(TextBox1.Text)

Dim temp As Encoding = Encoding.GetEncoding("shift_jis")

While stream.Read(Buffer, 0, Buffer.Length) > 0
    StrBuilder.Append(temp.GetString(Buffer))
End While

TextBox2.Text = StrBuilder.ToString

上記のように、読み込んだ文字データにEncoding.GetEncodingで用意したShift_JISUNICODE変換をかけてやらないと「@@」みたいな表示になってしまう。また、これを元にまたShift_JISで書き出すには、

Dim FileName As String = _
    IO.Path.GetDirectoryName(TextBox1.Text) & _
    "\外字ファイル_書き出し結果.txt"

Dim fs As New FileStream(FileName, FileAccess.Write, FileShare.Write)
fs.Close()

Dim stream As New StreamWriter(FileName, True, _
    Encoding.GetEncoding("shift_jis"))

stream.WriteLine(TextBox2.Text)
stream.Close()

こんな感じ。
文字コードの話は嫌い。ややこしいから。

*1:ブログ引っ越しの際に画像は消えてしまいました。ごめんなさい。