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

文字コード変換について

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

どぼんの情報をいつも参考にさせていただいています。

漢字(JISコード)・その他(EBCDIC)で出力されているテキストファイルをVB.NetでSJISに変換したいのですが、うまくいきません。

EBCDICからSJISはできるのですが、JISからSJISが文字化けしたままで変換されません。もし、わかる方がみえたら教えてください。
作成したコードを以下に掲示します。

Dim btStr As String
Dim btstLine As String
Dim btst As Byte
Dim btLine1() As Byte
Dim btLine2() As Byte
Dim btData() As Byte
Dim srfile1 As System.IO.FileStream = New System.IO.FileStream("test.txt", IO.FileMode.Open)
Dim srFile2 As New System.IO.BinaryReader(srfile1, System.Text.Encoding.GetEncoding(1026))
Dim srFile4 As New System.IO.BinaryReader(srfile1, System.Text.Encoding.GetEncoding(50222))
Dim srWriteFile1 As System.IO.FileStream = New System.IO.FileStream("testBinary.txt", IO.FileMode.Create)
Dim srWriteFile2 As New System.IO.BinaryWriter(srWriteFile1)

btLine1 = srFile2.ReadBytes(1000)
btLine2 = srFile4.ReadBytes(1000)
Do Until btLine1.Length = 0
'1行づつ読込む
btStr = System.Text.Encoding.GetEncoding(1026).GetString(btLine1, 0, 1)
If Trim(btStr) = "H" Or Trim(btStr) = "T" Then
btstLine = Trim(System.Text.Encoding.GetEncoding(1026).GetString(btLine1)) & vbCrLf
srWriteFile2.Write(System.Text.Encoding.GetEncoding(932).GetBytes(btstLine))
Else
btstLine = Trim(System.Text.Encoding.GetEncoding(1026).GetString(btLine1)) & vbCrLf
srWriteFile2.Write(System.Text.Encoding.GetEncoding(932).GetBytes(btstLine, 0, 20))
btstLine = Trim(System.Text.Encoding.GetEncoding(50222).GetString(btLine2, 21, 60)) & vbCrLf
srWriteFile2.Write(System.Text.Encoding.GetEncoding(932).GetBytes(btstLine))
End If
btLine1 = srFile2.ReadBytes(1000)
btLine2 = srFile2.ReadBytes(1000)
Loop
srFile2.Close()
srFile4.Close()
srWriteFile2.Close()
■No12708に返信(himeさんの記事)
> 漢字(JISコード)・その他(EBCDIC)で出力されているテキスト
> ファイルをVB.NetでSJISに変換したいのですが、うまくいきません。

コードページ 50222 は ISO-2022-JP の方言の一つですが、問題の JIS コー
ドは ISO-2022-JP を使って符号化されてはいない、ということはないですか?
「漢字(JISコード)」という表現からの想像ですが、このコードは JIS X
0208 の GL 領域での符号を、そのまま並べただけのコードなんじゃないでしょ
うか。問題の JIS コードは 0x1b で始まっていますか?

それから、基になるストリームを共有した二つの BinaryReader オブジェクト
は、本当に hime さんの意図どおりに動作します? ループ内では srFile4 を
使っていませんし、コードを全体的に見直した方がよさそうですよ。
■No12729に返信(おおたさんの記事)
> ■No12708に返信(himeさんの記事)
>>漢字(JISコード)・その他(EBCDIC)で出力されているテキスト
>>ファイルをVB.NetでSJISに変換したいのですが、うまくいきません。
>
> コードページ 50222 は ISO-2022-JP の方言の一つですが、問題の JIS コー
> ドは ISO-2022-JP を使って符号化されてはいない、ということはないですか?
> 「漢字(JISコード)」という表現からの想像ですが、このコードは JIS X
> 0208 の GL 領域での符号を、そのまま並べただけのコードなんじゃないでしょ
> うか。問題の JIS コードは 0x1b で始まっていますか?
>
> それから、基になるストリームを共有した二つの BinaryReader オブジェクト
> は、本当に hime さんの意図どおりに動作します? ループ内では srFile4 を
> 使っていませんし、コードを全体的に見直した方がよさそうですよ。

ありがとうございました。
SJISの場合、漢字コード前後にここから漢字が始まりますよという識別のために
シフトコードを付けなくてはいけないということがわかりました。

コードのご指摘もしていただきすみませんでした。
テストであまり気にせずに作っていたため、乱雑になってしまいました。
以後、掲示板に乗せる時は確認のうえ掲示するように気をつけます。
解決済み!
■No12879に返信(himeさんの記事)
> SJISの場合、漢字コード前後にここから漢字が始まりますよという識別のために
> シフトコードを付けなくてはいけないということがわかりました。

単なる書き間違いだと思いますが、「SJIS」ではなく JIS(ISO-2022-JP) です
よね。

もう解決したトピックですが、言葉が足りなかった部分などの補足を少し。

ISO-2022-JP の初期状態では、(GL 領域に呼び出されている G0 の)文字集合
として ASCII が指示されています。ですから、日本語の文字を使う場合には、
hime さんの記事にあるように、文字集合として JIS X 0208 を指示するため
の符号が必要です。この符号が 0x1b で始まるエスケープシーケンスです。最
初の記事に書いた 0x1b 云々は、そういう話です。

hime さんの記事には「シフトコード」とありますが、ISO 2022 準拠の符号化
方式では、文字集合の呼び出しのためにシフトを使います。文字集合を指示す
るためのエスケープシーケンスを、「シフトコード」と呼ぶとまぎらわしいで
すし、正しくありませんから、普通は「シフトコード」とは呼びません。
解決済み!

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