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

スポンサーリンク

【VBScript】FSOの「Format引数」でUnicodeを掌握する。文字化けを撲滅する極限の知見

システム運用の現場において、VBScriptが未だに捨てられない理由は明白だ。軽量であり、OSの深部にまでダイレクトにアクセスできる。しかし、多くのエンジニアがこの「言語の深淵」で躓くのが、文字コードの扱いだ。

特に`FileSystemObject (FSO)`の`OpenTextFile`メソッドにおいて、`Format`引数を曖昧に理解している者は、いずれ必ず「文字化け」という名の呪いに捕まる。今日は、UTF-16LE(Unicode)を巡る混沌を、アーキテクチャの視点から完全に支配下に置く方法を説く。

—

1. なぜ「デフォルト」を信じてはいけないのか

`OpenTextFile`メソッドのシグネチャを再確認しよう。

Set objFile = objFSO.OpenTextFile(filename, iomode, create, format)

この第4引数 `format` に指定する `Tristate` 定数こそが、ファイルの読み書きにおける文字コードの運命を決める。

  • TristateUseDefault (-2): システムのデフォルト。これが諸悪の根源だ。環境(OSのロケールや設定)に依存するため、開発環境では動いたコードが本番環境で文字化けする最大の要因となる。
  • TristateFalse (0): ASCII(ANSI)として開く。
  • TristateTrue (-1): Unicode(UTF-16LE)として開く。

現代のシステム連携において、UTF-8は避けて通れない。しかし、FSOがネイティブで完璧に扱えるのは「UTF-16LE」であるという、このレガシー特有の制約を理解しなければならない。

2. Unicodeファイルを安全に読み書きする極意

Unicodeファイルを扱う際、最も安全な戦略は「常に明示的に指定すること」だ。曖昧さを排除し、オブジェクトの生成から解放までを厳密に制御する。

実践コード:文字化けを防ぐUnicode操作

Option Explicit

‘ メモリリークを許さない。オブジェクト参照を厳密に管理する
Dim objFSO, objFile, strContent

Set objFSO = CreateObject(“Scripting.FileSystemObject”)

‘ 書き込み:TristateTrueを指定し、UTF-16LEで書き出す
Set objFile = objFSO.OpenTextFile(“C:\Logs\UnicodeData.txt”, 2, True, -1)
objFile.WriteLine “伝説のエンジニアは文字化けを許さない。”
objFile.Close
Set objFile = Nothing ‘ 即座にメモリを解放

‘ 読み込み:読み取り専用(1)かつTristateTrue(Unicode)で開く
Set objFile = objFSO.OpenTextFile(“C:\Logs\UnicodeData.txt”, 1, False, -1)
strContent = objFile.ReadAll
WScript.Echo strContent

‘ 後始末の徹底
objFile.Close
Set objFile = Nothing
Set objFSO = Nothing

3. 【深淵の知見】なぜFSOはUTF-8を嫌うのか

ここでシニアエンジニアとして補足しておこう。FSOは「BOM(Byte Order Mark)付きのUTF-16LE」を親とする仕様だ。BOMなしのUTF-8や、UTF-8への変換をFSO単体でスマートに行うことはできない。

もし、システム間連携でUTF-8のデータを受け取った場合、FSOの `OpenTextFile` に無理やり放り込んでも文字化けするか、あるいは例外が発生する。その場合は、ADODB.Stream オブジェクトを召喚するのが、我々アーキテクトの定石だ。

ADODB.Streamを用いたUTF-8完全対応コード

FSOに固執せず、適材適所でツールを変える。これが真の自動化エンジニアの嗜みだ。

Dim objStream
Set objStream = CreateObject(“ADODB.Stream”)

‘ UTF-8を指定して読み込む
objStream.Type = 2 ‘ adTypeText
objStream.Charset = “UTF-8”
objStream.Open
objStream.LoadFromFile “C:\Data\UTF8_Input.csv”

Dim strData
strData = objStream.ReadText
objStream.Close
Set objStream = Nothing

4. 現場で生き残るためのアーキテクチャ・ルール

1. 環境依存を殺せ: `TristateUseDefault` は禁句だ。常に `TristateTrue` か `TristateFalse` を明示しろ。
2. BOMを常に意識せよ: FSOが吐き出すUTF-16LEにはBOMが付く。後続のシステム(LinuxやWeb API等)がBOMを嫌う場合、ADODB.Streamを用いてBOMなしで出力するパイプラインを構築せよ。
3. オブジェクトのライフサイクルを完結させよ: VBScriptのガベージコレクションは頼りにならない。`Set obj = Nothing` を省略するエンジニアに、システムの安定を語る資格はない。

結びに代えて

VBScriptは古い。しかし、OSの根幹に寄り添うこの言語は、適切に扱えばこれ以上ないほど堅牢な自動化基盤となる。文字化けに悩まされるのは、道具のせいではなく、道具の仕様(APIの挙動)を理解しようとしなかった自分自身の怠慢である。

仕様の深淵を覗き込み、バイナリレベルでデータを制御せよ。それが、システムを支配するということだ。

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