【入門編】【コンソール表示レイアウト崩れ防止】マルチバイト文字の表示幅判定と自作Padding関数によるマルチ列揃え – VBScript (Visual Basic Scripting Edition)解析バイブル

スポンサーリンク

VBScriptでCLIの美学を。全角・半角混在の「ズレ」を完全に制御するPadding技術

こんにちは。自動化の現場でVBScriptと長年向き合ってきた、あなたの技術的伴走者です。

VBScriptで`WScript.Echo`を使ってコンソールにログを出力するとき、こんな経験はありませんか?
「文字数を揃えたはずなのに、全角文字が混じると列がガタガタに崩れる……」

これは、VBScriptが文字数(Length)を「文字の個数」として数える一方で、コンソールの表示幅は「全角=2、半角=1」という物理的な占有幅で決まるからです。この「論理と物理の乖離」を埋めない限り、どれだけスペースを詰めても美しいCLI(コマンドラインインターフェース)は作れません。

今日は、プロの現場でもそのまま使える「文字幅を正確に計算するPadding関数」の作り方を伝授します。ここをクリアすれば、あなたはもう「動くだけのスクリプト」から「洗練されたツール」を作れるエンジニアの仲間入りです。

なぜ「文字数」だけではダメなのか?

VBScriptの `Len()` 関数は、文字列の長さを「文字の数」で返します。

  • 「ABC」(半角3文字)→ `Len` は 3
  • 「あいう」(全角3文字)→ `Len` は 3

しかし、コンソール上では「ABC」は3マス、「あいう」は6マス分を占有します。この差を補正するためには、「その文字列がコンソールで何マス分占有するか」を計算する独自のロジックが必要です。

核心:全角・半角判定ロジックの構築

まずは、対象の文字列が「何マス分を消費するのか」を算出する関数から作りましょう。VBScriptでは、バイト数を利用して判別するのが最も確実で高速です。

‘ 文字列の表示幅(全角=2, 半角=1)を算出する関数
Function GetDisplayWidth(strText)
Dim i, charCode, totalWidth
totalWidth = 0

For i = 1 To Len(strText)
‘ 1文字ずつ取り出してAscBで判定する
‘ ASCコードが128より大きければ全角とみなす(Shift-JIS環境の鉄則)
If Asc(Mid(strText, i, 1)) < 0 Or Asc(Mid(strText, i, 1)) > 255 Then
totalWidth = totalWidth + 2
Else
totalWidth = totalWidth + 1
End If
Next
GetDisplayWidth = totalWidth
End Function

コードの解説

  • `Mid(strText, i, 1)`: 文字列を1文字ずつ分解します。
  • `Asc(…)`: 文字コードを取得します。日本語環境(Shift-JIS)では、全角文字は特殊な範囲の値を返すため、これを利用して幅を判定します。

現場で使える「Padding関数」の実装

次に、この幅判定を使って「指定した桁数になるまでスペースで埋める」関数を作成します。

‘ 文字列を左寄せして指定幅に揃える関数
Function PadRight(strText, targetWidth)
Dim currentWidth
currentWidth = GetDisplayWidth(strText)

‘ 指定幅に足りない分だけスペースを追加
If currentWidth < targetWidth Then PadRight = strText & Space(targetWidth - currentWidth) Else PadRight = strText End If End Function ' 使用例:ログ出力の整形 WScript.Echo PadRight("ID", 10) & " | " & "ユーザー名" WScript.Echo PadRight("101", 10) & " | " & "佐藤" WScript.Echo PadRight("102", 10) & " | " & "山田太郎"

実行結果のイメージ

ID | ユーザー名
101 | 佐藤
102 | 山田太郎

このように、全角・半角が混ざっていても、`|` の位置がピタリと揃います。これが美しいCLIの第一歩です。

さらに極めるための注意点

1. Shift-JISの呪縛

VBScriptは古い技術であるため、文字コードの扱いに注意が必要です。もしUTF-8で保存したスクリプトを `cscript` で動かすと、文字化けや判定ミスが起きることがあります。スクリプトファイルは「ANSI(Shift-JIS)」で保存するのが、VBScriptを安定させるための「現場の知恵」です。

2. パフォーマンスへの配慮

今回の `PadRight` は非常に軽量ですが、もし数万行のログをループで処理する場合は、`Space()` 関数を何度も呼び出すよりも、あらかじめバッファを作っておくなどの最適化が効いてきます。まずはこの関数で安定稼働を目指し、ボトルネックを感じたら最適化する。これがエンジニアの正しいステップです。

最後に:自動化は「細部」に宿る

「ただ動けばいい」スクリプトは初心者でも書けます。しかし、「出力結果が読みやすく、メンテナンス性が高い」スクリプトは、プロのエンジニアの証です。

今回作成した `PadRight` 関数を共通部品(.vbsファイル)として切り出しておけば、今後どんなツールを作る時にも役立つあなたの強力な武器になります。

VBScriptは古い言語と言われますが、Windows環境での小回りの良さは今もなお現役です。ぜひ、この「美学」をあなたのコードにも取り入れてみてください。応援していますよ!

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