初めて質問する愛与と申します。
貴重なこの場をお借りできることを、管理人様に感謝させて頂きます。
初めて故、不手際があるかもしれませんが、何卒よろしくお願い致します。
Access2003のVBAを使用してVB6.0ならびに、VB.NET(VS2008)のソースから
イベント名及びメソッド名を読み取ろうと考えています。
下記のソースを使用してVB6.0(.frmファイル)からイベント名等は取れたのですが、
VB.NET(.vbファイル)を読み取ると文字化けしてしまいます。
原因が文字コードの違いというところまではわかったのですが
ADODB.Streamによる変換もうまくいかず、悩んでいます。
文字コードを指定してファイルを開く方法、もしくは
読み取った文字列を別の文字コードに変換等は難しいのでしょうか?
'--------------------------------------------------------------------
'[名称] EventNameOutPut
'
'[概要] 指定されたファイルから、イベント、メソッド名を抜き取る。
'
'[処理] 1、テキストストリームでファイルを開く。
' 2、イベント名等を抜き出す。
'--------------------------------------------------------------------
Private Sub EventNameOutput(ByRef rstrList() As String, ByVal vstrFolderPath As String)
On Error GoTo Err_
Dim objFso As FileSystemObject 'vbファイル読取用
Dim objTso As TextStream
Dim strLine As String
Dim i As Integer 'ファイルカウント
Dim Sli As Integer '文字カウント
Dim Pi As Integer '貼り付け行
Dim intStart As Integer '読取開始位置
'各カウントの初期値を設定
i = 0
'選択されたファイル数分処理を行います。
For i = 0 To UBound(rstrList)
Set objFso = New FileSystemObject
Set objTso = objFso.OpenTextFile(vstrFolderPath & rstrList(i), ForReading)
'イベント、文字数カウントをリセット
Sli = 0
Pi = 2
'ファイル名を一行目に。
Debug.Print rstrList(i)
'読取終了位置まで一行づつ読み込みます。
Do Until objTso.AtEndOfStream
strLine = objTso.ReadLine
'1文字目から読み取り、イベントもしくはメソッドであるかを確認します。
Select Case True
Case Left(strLine, 16) = "Private Function"
intStart = 16
Case Left(strLine, 11) = "Private Sub"
intStart = 11
Case Left(strLine, 20) = " Private Function"
intStart = 20
Case Left(strLine, 15) = " Private Sub"
intStart = 15
Case Else
intStart = 0
End Select
'どちらでもなければ次の周回へ。
If intStart = 0 Then
Else
'イベントもしくはメソッド名が見つかった場合は、名を抜き取ります。
'"("が見つかるまで回します。
For Sli = intStart To Len(strLine)
'イベント名の後の1文字目は必ず「 ( 」のはず!
If Mid(strLine, Sli, 1) = "(" Then
'イベント名を抜き取り一時保存 「( 」を読み取りたくないので、読取文字数を - 1 します。
Debug.Print LTrim(Mid(strLine, intStart + 1, Sli - intStart - 1))
Pi = Pi + 1
Exit For
End If
Next
End If
Loop
'ここまで使用したオブジェクトを一旦開放。
objTso.Close
Set objTso = Nothing
Set objFso = Nothing
Next
Exit_:
Exit Sub
Err_:
MsgBox "Number : " & Err.Number & vbCr & _
"Source : " & Err.Source & vbCr & _
"Description : " & Err.Description, _
vbCritical, _
"システムエラー"
Resume Exit_
End Sub
VB.NET のソースは 2003 以前だと Shift-JIS、2005 以降では、
UTF-8 でエンコードされているようです。
http://www.atmarkit.co.jp/fdotnet/dotnettips/609vsfileencode/vsfileencode.html
2003 から 2005 にアップグレードしたソースの場合は Shift_Jis のまま
だったりするので、どちらのコードで保存されているか判断が必要です。
先頭3バイトをバイナリで読み込んで、EF,BB,BF だったら UTF-8、
それ以外なら Shift_Jis と判断し
With New ADODB.Stream
.charset = charset ' "utf-8" or "Shift_Jis" をセット
.Open
.LoadFromFile FileName
Text1.Text = .ReadText
End With
こんなコードで読めるはずです。
Koz様
ご返信ありがとうございます。
UTF-8だったのですね。
Koz様のサンプルを参考に、書き直したところうまく動きました。
私がADO Streamで出来なかったのは、文字コードの指定と
ReadTextの引数がうまく設定できていなかったみたいで。。。
書き直したところ、TextStreamと全く同じ結果を
得ることができるようになりました。
Koz様、ありがとうございました。
解決とさせて頂きます。
貴重な場をお借りいただけたことを管理人様に感謝いたします。
ツイート | ![]() |