【入門編】【文字化け完全防止】FSOのOpenTextFileでUnicode(UTF-16LE)ファイルを正しく扱いこなすFormat引数の活用テクニック – VBScript (Visual Basic Scripting Edition)解析バイブル

スポンサーリンク

こんにちは。自動化の現場で数々の修羅場をくぐり抜けてきたアーキテクトです。

VBScriptで最も多くの開発者を絶望の淵に追い込むもの、それは「文字化け」です。特にFSO(FileSystemObject)を使ってファイルを読み書きする際、「なぜか日本語が豆腐(□)になる」「読み込んだら文字化けしてスクリプトが止まる」といった経験はないでしょうか。

今日は、FSOの `OpenTextFile` メソッドにおける最大の難所、「Format引数」の正体を完全に掌握し、二度と文字化けに悩まないための極意を伝授します。

—

1. なぜ「Format引数」で躓くのか?

`OpenTextFile` メソッドは、実は非常に強力ですが、デフォルトの設定は「ASCII(システム標準)」を想定しています。

‘ 一般的な書き方
Set ts = fso.OpenTextFile(“data.txt”, 1)

この書き方だと、現代の標準である「UTF-8」やWindowsの歴史的遺産である「UTF-16LE」を扱う際に、VBScriptが文字の解釈を誤ります。ここで登場するのが、第4引数である `Format` です。

Format引数の定数表

| 定数 | 値 | 意味 |
| :— | :— | :— |
| TristateFalse | 0 | ASCIIとして開く(デフォルト) |
| TristateTrue | -1 | Unicode(UTF-16LE)として開く |
| TristateUseDefault | -2 | システムのデフォルト設定を使用する |

ここが重要です: VBScriptの `OpenTextFile` は、「UTF-8」を直接指定する引数を持っていません。 多くの初心者がここで挫折しますが、UTF-16LE(BOM付きUnicode)を扱うのであれば、`TristateTrue` を指定するだけで驚くほど簡単に解決するのです。

—

2. 実践:Unicode(UTF-16LE)ファイルを安全に扱うコード

まずは、Unicodeファイルを読み書きするためのテンプレートを用意しました。ここをクリアすれば、あなたはもう脱・初心者です。

Option Explicit

Dim fso, ts, filePath, content
Set fso = CreateObject(“Scripting.FileSystemObject”)

filePath = “C:\Temp\test.txt”

‘ — 書き込み処理 (Unicodeとして保存) —
‘ 第4引数に -1 (TristateTrue) を指定することで、UTF-16LEとして書き込まれる
Set ts = fso.OpenTextFile(filePath, 2, True, -1)
ts.WriteLine “これはUnicode(UTF-16LE)で書き込まれたテストテキストです。”
ts.Close

‘ — 読み込み処理 (Unicodeとして解読) —
‘ 第4引数に -1 (TristateTrue) を指定することで、正しく読み込める
Set ts = fso.OpenTextFile(filePath, 1, False, -1)
content = ts.ReadAll
ts.Close

WScript.Echo “読み込み成功: ” & content

このコードのポイント

1. `2` (ForWriting): ファイルを新規作成または上書きモードで開きます。
2. `True`: ファイルが存在しない場合に自動作成します。
3. `-1` (TristateTrue): これが今回の肝です。「このファイルはUnicode(UTF-16LE)ですよ」とFSOに明示的に伝える魔法の数字です。

—

3. なぜ「TristateTrue」を使うのか?

もしここでデフォルトの `0`(TristateFalse)のままUnicodeファイルを開こうとすると、VBScriptは2バイト文字を1バイトずつ分解して読もうとします。結果、奇妙な空行が入ったり、完全に文字化けしたりします。

`TristateTrue` を指定することで、VBScriptは「BOM(Byte Order Mark)」を正しく認識し、2バイトの塊を正しく1文字としてメモリに展開してくれるのです。

—

4. もし「UTF-8」を扱いたい場合は?

鋭い読者なら、「Webの標準であるUTF-8はどうすればいいの?」と疑問に思うはずです。
残念ながら、VBScript単体の `OpenTextFile` ではUTF-8を完璧に制御できません。

もし現場でUTF-8を扱う必要があるなら、`ADODB.Stream` オブジェクトを使うのがプロの常識です。

‘ UTF-8を扱う場合の黄金パターン
Dim stream
Set stream = CreateObject(“ADODB.Stream”)
stream.Type = 2 ‘ adTypeText
stream.Charset = “UTF-8”
stream.Open
stream.LoadFromFile(“C:\Temp\utf8_file.txt”)
content = stream.ReadText
stream.Close

—

最後に:先輩からのアドバイス

VBScriptは古い言語と言われますが、Windows環境の自動化において、これほど軽量かつ強力な武器はありません。

今日覚えた「Format引数」と「TristateTrue」の使い方は、ファイル操作における最も基本的な「守り」です。この基本さえ押さえておけば、文字化けという名のイライラから解放され、より本質的な業務ロジックの構築に集中できるはずです。

何か分からないことがあれば、いつでもコードを書いて試してみてください。失敗した数だけ、あなたは熟練のエンジニアに近づいています。応援していますよ!

タイトルとURLをコピーしました