読者です 読者をやめる 読者になる 読者になる

英数文字列を半角または全角に変換

VBVBAだとStrConvという便利な関数が使えるのだが、
VBSに該当または同等の関数が無い為作ってみた。

英数のみで言えば文字コードを一定量シフトさせることで
半角または全角変換は難なく実現した。

記号及びカタカナに関してはシフトJISの場合
文字の並びに類似性が無く、
煩雑な実装が必要だったので非対応とした。
(1文字づつ判定して処置してく事になる。)

ASCII文字コード - IT用語辞典

文字コード表 シフトJIS(Shift_JIS)

当初の目的が自作VBSで受け取った
ASIN/ISBNの全角文字列を半角に変換だったから、
これはこれで良しとする。

(余談だが、追加インストールを厭わなければ、
BASP21.DLLを導入することで、
COMコンポーネントからStrConvが使える模様。)

BASP21 DLL


英数全半角変換.vbs

Option Explicit

'ASCII <-> Shift_JIS 文字コード変換補数
Const SHIFT_CODE = &H7DE1

Dim input

'全角英数→半角変換テスト
input = InputBox("全角英数を半角に変換します。", "全角英数を半角に変換")
WScript.Echo "入力: " & input & vbCrLf & _
    "出力: " & StrConvNarrow(input)

'半角英数→全角変換テスト
input = InputBox("半角英数を全角に変換します。", "半角英数を全角に変換")
WScript.Echo "入力: " & input & vbCrLf & _
    "出力: " & StrConvWide(input)


'サブルーチン

'指定した文字列の全角英数を半角に変換して返す
Function StrConvNarrow(strWide)
    Dim length, index, retStr, retChar, tempChar, tempCode
    retStr = ""
    StrConvNarrow = retStr
    
    length = Len(strWide)
    For index = 1 To length
        tempChar = Mid(strWide, index, 1)
        tempCode = Asc(tempChar)
        If (tempCode >= &H824F And tempCode <= &H8258) Or _
            (tempCode >= &H8260 And tempCode <= &H8279) Then
            '文字コードが Shift_JIS 0~9: &H824F~&H8258 
            'または A~Z: &H8260~&H8279 だった場合
            retChar = Chr(tempCode + SHIFT_CODE)
            
        ElseIf tempCode >= &H8281 And tempCode <= &H829A Then
            '文字コードが Shift_JIS a~z: &H8281~&H829A だった場合
            retChar = Chr(tempCode + SHIFT_CODE - 1)
        Else
            '文字コードが変換対象外だった場合
            retChar = tempChar
            
        End If
        retStr = retStr & retChar
    Next
    
    StrConvNarrow = retStr
End Function

'指定した文字列の半角英数を全角に変換して返す
Function StrConvWide(strNarrow)
    Dim length, index, retStr, retChar, tempChar, tempCode
    retStr = ""
    StrConvWide = retStr
    
    length = Len(strNarrow)
    For index = 1 To length
        tempChar = Mid(strNarrow, index, 1)
        tempCode = Asc(tempChar)
        If (tempCode >= &H30 And tempCode <= &H39) Or _
            (tempCode >= &H41 And tempCode <= &H5A) Then
            '文字コードが ASCII 0~9: &H30~&H39 
            'または A~Z: &H41~&H5A だった場合
            retChar = Chr(tempCode - SHIFT_CODE)
            
        ElseIf tempCode >= &H61 And tempCode <= &H7A Then
            '文字コードが ASCII a~z: &H61~&H7A だった場合
            retChar = Chr(tempCode - SHIFT_CODE + 1)
            
        Else
            '文字コードが変換対象外だった場合
            retChar = tempChar
            
        End If
        retStr = retStr & retChar
    Next
    
    StrConvWide = retStr
End Function