小さい頃はエラ呼吸

いつのまにやら肺で呼吸をしています。


VBScrptでファイルの文字コードを自動的に判定して読み込む方法

VBScriptでローカルファイルの読み書きを行う場合、以下の2つのオブジェクトを利用することができます。

  • FileSystemObject(ファイルシステムオブジェクト)
  • ADODB.Streamオブジェクト

両者の違いは、簡単にいうと扱える文字コードが違います。FileSystemObjectでは、ファイルを読み書きする際の文字コードとして、Shift_JISとUTF-16をサポートしています。一方、ADODB.Streamオブジェクトでは、Shift_JIS、EUCやUTF-8などの文字コードもサポートしています。

ファイル読み込む際に文字コードを自動判定する

ファイルを読み込む際に、文字コードを自動的に判定して読み込むには、ADODB.StreamオブジェクトのCharsetプロパティに"_autodetect_all"を指定します。これにより、ADODB.Streamがファイルの文字コードを自動判定して、適切な文字コードでオープンしてくれるそうです。*1

With CreateObject("ADODB.Stream")
  .Open
  .Charset = "_autodetect_all"
  .LoadFromFile("xxx.txt")
  data = .ReadText
  .Close
End With

また、_autodetect_allを指定した場合に、lineseparatorの指定でうまくいかないことがありました。lineseparatorプロパティは、adCR、adCRLF、adLFの3つの値を指定することができますが、Windos標準のadCRLFを指定した場合でも、適切な箇所でデータを分割することができませんでした。
このため、以下のような改行コードを返す関数を作成し、ReadText関数で取得した全テキストデータに対して、改行コードでsplitを行い、1行分のデータを取得するようにしました。

Function GetLineSeparator(str)
  If Instr(str, vbCrLf) <> 0 Then
    GetLineSeparator = vbCrLf
  ElseIf Instr(str, vbLf) <> 0 Then
    GetLineSeparator = vbLf
  Else
    GetLineSeparator = vbCr
  End If
End Function

参考サイト

*1:UTF-16など一部の保存形式で、誤判定するみたい。データによって誤判定するみたいで、たまに文字化けして正しく読み込めない場合がありました。