ファイルを読み込むときに文字コードを判別せずに文字コードを指定すると、文字化けになって苦労します。
業務の場合だと、文字化けになるからこの文字コードでファイルを作成してと指定しているところもあるのではないでしょうか?
システムに理解のある取引先であれば、それで問題ありませんがプログラムに疎い企業様からすると、それぐらい何とかしてくれと思うでしょう。
VBScriptで文字コードの判定を紹介しているサイトが無かったので記事にしました。
サンプルコードは、私自身が作成したオリジナルのプログラムです。
分かりやすくするために必要最低限のプログラムのみ書いています。
また、定数は大文字じゃないといった皆さん自身のルールがあるかもしれませんがご理解ください。
当記事は、実践編としてVBScriptの基本的な文法がわかる中級者の方にご紹介しています。
基本的な文法がわからない方は、初級編の記事も紹介しているのでそちらを参考にしてください。
文字コードの判定とファイル内の文字データを取得するサンプルコード
SampleCode.vbs
'【定数】
Const PATH_FULL_CSV = "ここにチェックしたいテキストファイルのフルパスを記述"
Const adTypeBinary = 1
Const adTypeText = 2
Const adReadAll = -1
'Streamオブジェクトを生成
With CreateObject("ADODB.Stream")
.Type = adTypeBinary 'バイナリデータに設定
.Open 'Streamを開く
.Position = 0 '位置を先頭へ
.LoadFromFile PATH_FULL_CSV '読み込むファイルを設定
Dim binData : binData = .Read(adReadAll) '現在の位置からすべてのバイトを取得
.Close 'Streamを閉じる
'エラーの無視を開始
On Error Resume Next
'チェックしたい文字コード分ループ
For Each index In Array("Shift-JIS","UTF-8","Unicode","ASCII")
.Open 'Streamを開く
.Type = adTypeBinary 'バイナリデータに設定
.Write binData 'バイナリデータを書き込む
.Position = 0 '位置を先頭へ
.Type = adTypeText 'テキストデータに設定
.Charset = index 'チェックしたい文字コードで設定
Dim strData : strData = .ReadText(adReadAll) '現在の位置からすべての文字を取得
'エラーが発生しているかチェック
If Err.Number <> 0 Then
'文字コードが不一致の場合はエラーが発生する
'次の文字コードをチェックするためにクリアする
Err.Clear
Else
'結果を表示
MsgBox "【文字コード】" & .Charset & vbCrLf & strData
Exit For
End If
.Close 'Streamを閉じる
Next
'エラーの無視を終了
On Error Goto 0
End With
解説①:定数の宣言
チェックしたいテキストファイルのパス、Typeプロパティの値、ReadメソッドとReadTextメソッドの値を定数かしています。
PATH_FULL_CSVの文字列をチェックしたいファイルのフルパスに置き換えてください。
csv、tsv、txtテキストファイルなどがチェックできます。
解説②:チェックしたいテキストファイルのバイナリデータを取得する
はじめにWithステートメントを使用してStreamオブジェクトを作成しています。
チェックしたいテキストファイル内の全文字をバイナリデータで変数「binData」に保持しています。
解説③:エラーの無視を開始する
解説②で保持したバイナリデータを指定した文字コードの文字に戻せるかチェックするために「On Error Resume Next」でエラーを無視するようにしています。
指定の文字コードの文字に置換できない場合は、エラーが発生します。
解説④:文字コードのチェック
チェックしたい文字コード分ループをしています。
当記事の例では、比較的使用頻度の高いと思う文字コード(UTF-8,Shift-JIS,Unicode,ASCII)の4つをチェックしています。
足りない方は、文字コードを追加してください。
他のサイトで、Charsetプロパティに”_autodetect_all”を設定するとファイルの文字コードを自動で設定してくれると書かれた記事があり、私も”_autodetect_all”を試しました。
しかし、上手く機能しなかったため当記事の方法で判定した後にファイル内の文字データを取得しています。
”_autodetect_all”で上手くいく方は、コードが簡略化できるため、そのやり方で良いと思います。
Streamを開き直してから、解説②で保持したバイナリデータを書き込んで「.Type = adTypeText」でテキストデータに設定します。
次に「.Charset = index」でバイナリデータを文字データに置換しています。
ここでチェックしたいテキストファイルの文字コードと一致すると、文字データに戻せるため、エラーは起きません。
しかし、不一致の場合は戻せないのでエラーが発生します。
一致したかを確認するために「If Err.Number <> 0 Then」でエラーが発生したかをチェックしています。
エラーが発生している場合は、Err.Numberが0以外になります。
解説⑤:文字データの取得
文字コードが不一致の場合は、次の文字コードをチェックするためにエラー情報が格納されたオブジェクト「Err」をクリアしています。
文字コードが一致した場合(Elseの場合)は、どの文字コードだったかをメッセージボックスで確認しています。
実際に当記事のプログラムを使用するときは、プログラム内で使い回すことができるので当記事のプログラムを関数化して使用すると良いと思います。