投稿日 | : 2004/02/25(Wed) 16:59 |
投稿者 | : 澤田 |
Eメール | : |
URL | : |
タイトル | : 【追加質問】文字コード変換について |
ak様、判り易いサンプルありがとうございます。
いただいたサンプルを実行してみたところ、SELECT CASEのところで、
入力コードが左右反転してしまっていて&HF040に引っかからなかった
ので、
iValue = CInt("&H" + RightB(Hex(iValue), 4) + LeftB(Hex(iValue), 4))
で左右反転をさせ、SELECT CASEにひっかけて、判定後
iRet = CInt("&H" + RightB(Hex(iRet), 4) + LeftB(Hex(iRet), 4))
とし、元に戻したところ、うまくコード変換することが出来ました。
すごく助かりました。
本当にありがとうございます。
ところで、新たな疑問が出来ました。
書き忘れていたのですが、入力出力とも1,2バイト混在なのです。
入力データで
/*****************/
あ
1
20
あ
/*****************/
を読むと、
/*****************/
あレ」20モィあ
/*****************/
と出力されました。
調べると、以下の現象が起きていました。
・"0D0A"(改行コード)が"A0D"で取得されていました。
左右反転だと"0A0D"が正常だと思うのですが、前0(ゼロ)が
きられているように見えます。
・"310D0A"(1 + 改行コード + 2)が"D31" "320A"で取得され
ていました。
本来なら"3100" "0A0D"と読ませたいのですが・・・
以上、1バイトコードの制御をしていない為の現象だとはわかる
のですが、そもそもなぜ文字コードが左右反転するのか、前0(ゼロ)
が削除されるのかが理解できません。
またバイナリで処理をする場合、1バイトか2バイトかはどのよう
にして見分ければよいのでしょうか?
INPUTで1文字ずつ読んでそれをINT型に変換すればよいのでしょうか?
初歩的な入出力の問題で申し訳ありませんが、ご教授いただけます
でしょうか。
よろしくお願い致します。
> こんにちは。
>
> >・入力ファイルをバイナリで読む。
> >・1文字ずつ検索(INPUT)し、S-JISコードが4桁(2バイトコード)なら以下を行う。
> >・入力用変換TBLを検索し位置する文字列を探す。
> >・一致したら同じ開始位置で出力用TBLから変換文字コードを取得し変数に代入
> >・変数に$hを連結しChrで文字に変換する。
> >・変換した文字列をString配列に代入し、その後配列の該当個所を出力ファイルに
> > PUTする。
>
> ようするにファイル内容を2バイトずつ読込み[F040]〜[F1FC]を[EB40]〜[ECFC]に
> [FA40]〜[FCFC]を[ED40]〜[EFFC]にそれ以外はそのまま出力できれば良いのですよね。
>
> 下記にサンプルを記述しておきましたので参考にしてください。
>
> はずしていたらすみません。
>
> '(*.frm)フォームにCommandButtonを1個配置してください。
> Option Explicit
> Private Const FILE_TEST_PATH = "C:\Test.dat" '元ファイルのフルパス
> Private Const FILE_CONV_PATH = "C:\Test2.dat" '変換後ファイルのフルパス
>
> Private Sub Form_Load()
> Dim ii As Integer
> Dim iFF As Integer
>
> If Dir(FILE_TEST_PATH) = "" Then
>
> 'テストデータ作成
> iFF = FreeFile() '空きファイル番号取得
>
> Open FILE_TEST_PATH For Binary Access Write As #iFF
>
> For ii = &HF040 To &HF1FC
> Put #iFF, , ii
> Next ii
>
> For ii = &HFA40 To &HFCFC
> Put #iFF, , ii
> Next ii
>
> Close #iFF
>
> End If
>
> End Sub
>
> Private Sub Command1_Click()
> If pfnFileConv(FILE_TEST_PATH, FILE_CONV_PATH) Then MsgBox "変換しました。", vbInformation
> End Sub
>
> '****************************************************************
> '概要 :コード変換
> 'パラメータ :変数名 ,IO ,型 ,説明
> ' :sSrcFile ,I ,String ,元ファイル
> ' :sSrcFile ,I ,String ,変換ファイル
> ' :戻り値 ,O ,Boolean ,True:成功 False:失敗
> '説明 :コードを変換し指定されたファイルに出力する
> '****************************************************************
> Private Function pfnFileConv(ByVal sSrcFile As String, ByVal sConvFile As String) As Boolean
> Dim iFF(1) As Integer 'ファイル番号
> Dim iTmp As Integer
>
> On Local Error GoTo Error_Handler
>
> pfnFileConv = False
>
> iFF(0) = FreeFile()
>
> Open sSrcFile For Binary Access Read As #iFF(0)
>
> iFF(1) = FreeFile()
>
> Open sConvFile For Binary Access Write As #iFF(1)
>
> Do While Not EOF(iFF(0))
> Get #iFF(0), , iTmp
> Put #iFF(1), , pfnConv(iTmp)
> Loop
>
> Close #iFF(1)
>
> Close #iFF(0)
>
> pfnFileConv = True
>
> Exit Function
> Error_Handler:
> MsgBox "エラーNo:" & Err.Number & vbCrLf & "エラー内容" & Err.Description, vbCritical
> End Function
>
> '****************************************************************
> '概要 :コード変換
> 'パラメータ :変数名 ,IO ,型 ,説明
> ' :iValue ,I ,Integer ,コード
> ' :戻り値 ,O ,Integer ,変換されたコード
> '説明 :
> '****************************************************************
> Private Function pfnConv(ByVal iValue As Integer) As Integer
> Dim iRet As Integer
> Const CNS_F040_F1FC = &HEB40 - &HF040
> Const CNS_FA40_FCFC = &HED40 - &HFA40
>
> Select Case iValue
> Case &HF040 To &HF1FC
> iRet = iValue + CNS_F040_F1FC
> Case &HFA40 To &HFCFC
> iRet = iValue + CNS_FA40_FCFC
> Case Else
> iRet = iValue
> End Select
>
> pfnConv = iRet
>
> End Function