- 題名: 文字コード変換について
- 日時: 2005/09/09 14:23:07
- ID: 12708
- この記事の返信元:
- (なし)
- この記事への返信:
- [12729] Re[1]: 文字コード変換について2005/09/11 6:54:22
- ツリーを表示
■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 を 使っていませんし、コードを全体的に見直した方がよさそうですよ。
■No12879に返信(himeさんの記事) > SJISの場合、漢字コード前後にここから漢字が始まりますよという識別のために > シフトコードを付けなくてはいけないということがわかりました。 単なる書き間違いだと思いますが、「SJIS」ではなく JIS(ISO-2022-JP) です よね。 もう解決したトピックですが、言葉が足りなかった部分などの補足を少し。 ISO-2022-JP の初期状態では、(GL 領域に呼び出されている G0 の)文字集合 として ASCII が指示されています。ですから、日本語の文字を使う場合には、 hime さんの記事にあるように、文字集合として JIS X 0208 を指示するため の符号が必要です。この符号が 0x1b で始まるエスケープシーケンスです。最 初の記事に書いた 0x1b 云々は、そういう話です。 hime さんの記事には「シフトコード」とありますが、ISO 2022 準拠の符号化 方式では、文字集合の呼び出しのためにシフトを使います。文字集合を指示す るためのエスケープシーケンスを、「シフトコード」と呼ぶとまぎらわしいで すし、正しくありませんから、普通は「シフトコード」とは呼びません。
分類:[.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()