VBScript: UTF-8のファイルを読み込む方法
VBScriptで文字コード(文字エンコーディング) がUTF-8のファイルを読み込む場合は、 ADODB.Stream オブジェクトを利用します。
ファイルの読み書きで通常使用するファイルシステムオブジェクトだと Shift-JISかUnicode(UTF-16)の読み書きしかできません。 そこで ADODB.Stream オブジェクトを利用してUTF-8のファイルを読み込みます。
ADODB.Stream オブジェクトでは複数のプロパティを設定する必要があるため、 ファイルシステムオブジェクトを利用する時よりも少し面倒です。
メソッドやプロパティの詳細についてはMicrosoftのページが参考になります。
(Stream オブジェクトのプロパティ、メソッド、およびイベント | Microsoft Docs)
以下で全行を一度に読み込む場合と、 1行ずつ読み込む場合に分けてサンプルコードを紹介します。
UTF-8のファイルを全行読み込む
次のサンプルコードではUTF-8のテキストファイル「b.txt」を、 一度で全行読み込んで内容を表示します。
strFile = "d:\test\vbs\b.txt" 'ADODBオブジェクト作成 Set objAdo = CreateObject("ADODB.Stream") 'ストリームオブジェクトをオープン objAdo.Open objAdo.Type = 2 ' テキストファイル objAdo.Charset = "UTF-8" ' 文字エンコーディング objAdo.LineSeparator = 10 ' 区切り文字 (LF) objAdo.LoadFromFile strFile ' ファイルをストリームに読み込む ' ファイルの読み込み(全行) strAll = objAdo.ReadText(-1) ' クローズ objAdo.Close '表示 WScript.Echo strAll
流れとしては、Openメソッドでストリームオブジェクトをオープンした後に、 プロパティを設定して、LoadFromFile メソッドでファイルをストリームに読み込みます。
Open メソッド
Open メソッドはストリームオブジェクトを開き、 データのストリームを操作します。
'ストリームオブジェクトをオープン objAdo.Open
Type プロパティ
Type プロパティではストリームに格納されているデータが バイナリかテキストかを指定します。規定値は2なので省略しても大丈夫です。
値 | 意味 |
---|---|
1 | バイナリデータ |
2 | テキストデータ |
Charset プロパティ
Charsetプロパティでは文字セットを指定します。 規定値はUnicode(UTF-16)です。
今回は「"UTF-8"」と指定しています。
LineSeparator プロパティ
「LinSeparator」プロパティでは改行文字を指定します。
指定する値は次の通りです。
今回のサンプルコードでは「10(LF)」を指定しています。
値 | 意味 |
---|---|
13 | CR |
-1 | CR+LF(規定値) |
10 | LF |
LoadFromFile メソッド
LoadFromFile メソッドは、 指定したファイルの内容をストリームに読み込みます。
objAdo.LoadFromFile strFile ' ファイルをストリームに読み込む
LoadFromFile メソッドを実行する前に、 Openメソッドでストリームオブジェクトが開かれている必要があります。
ReadText メソッド
ReadTextメソッドでストリームからファイル内容を読み込みます。
一度に全行読み込む場合は、ReadTextメソッドの引数に(-1)を指定します。
値 | 意味 |
---|---|
-1 | 全行(現在の位置から EOS マーカーまで) |
-2 | 次の行(1行) |
規定値が「-1」なので省略した場合は全行読み込みとなります。
' 全行読み込み strAll = objAdo.ReadText(-1) ' これも全行読み込み strAll = objAdo.ReadText
UTF-8のファイルを1行ずつ読み込む
次のサンプルコードではUTF-8のテキストファイル「b.txt」を、 1行ずつ読み込んで内容を表示します。
strFile = "d:\test\vbs\b.txt" 'ADODBオブジェクト作成 Set objAdo = CreateObject("ADODB.Stream") 'ストリームオブジェクトをオープン objAdo.Open objAdo.Type = 2 ' テキストファイル objAdo.Charset = "UTF-8" ' 文字コード objAdo.LineSeparator = 10 ' 区切り文字 (LF) objAdo.LoadFromFile strFile ' ファイルを読み込む strAll = "" ' ループ Do while objAdo.EOS <> True ' ファイルの読み込み(1行) strAll = strALl & objAdo.ReadText(-2) & vbLf Loop ' クローズ objAdo.Close ' 表示 WScript.Echo strAll
先程紹介した全行読み込みのコードと比べて、 異なるのは次の部分だけです。他は同じです。
strAll = "" ' ループ Do while objAdo.EOS <> True ' ファイルの読み込み(1行) strAll = strALl & objAdo.ReadText(-2) & vbLf Loop
ReadText メソッド
今回は1行ずつ読み込むため、引数に「-2」を指定します。
objAdo.ReadText(-2)
値 | 意味 |
---|---|
-1 | 全行(現在の位置から EOS マーカーまで) |
-2 | 次の行(1行) |
「ReadText(-2)」で読み込んだ1行分に改行コードはついていません。 ですから必要に応じて改行コードを付加してください。
EOSプロパティ
EOSプロパティは現在位置がストリームの末尾かどうかを示します。 末尾の場合はTrue、末尾でない場合はFalseを返します。