● 文字列変換をする(全角⇔半角 etc...) ●

ぶっちゃけた話、StrConv もどきである。

Private Declare Function LCMapString Lib "kernel32" Alias "LCMapStringA" (ByVal Locale As Long, ByVal dwMapFlags As Long, ByVal lpSrcStr As String, ByVal cchSrc As Long, ByVal lpDestStr As String, ByVal cchDest As Long) As Long

Private Const LCMAP_LOWERCASE = &H100
Private Const LCMAP_UPPERCASE = &H200
Private Const LCMAP_SORTKEY = &H400
Private Const LCMAP_BYTEREV = &H800
Private Const LCMAP_HIRAGANA = &H100000
Private Const LCMAP_KATAKANA = &H200000
Private Const LCMAP_HALFWIDTH = &H400000
Private Const LCMAP_FULLWIDTH = &H800000

Private Declare Function GetSystemDefaultLCID Lib "kernel32" () As Long

Private Declare Function lstrlen Lib "kernel32" Alias "lstrlenA" (ByVal lpString As String) As Long

'定数(列挙型)
Public Enum StrConvValue
    LOW_TO_UPPER   '小文字→大文字
    UPPER_TO_LOW   '大文字→小文字
    ZEN_TO_HAN     '全角→半角
    HAN_TO_ZEN     '半角→全角
    HIR_TO_KAT     '全角ひらがな→全角カタカナ
    KAT_TO_HIR     '全角カタカナ→全角ひらがな
    ZEN_TO_HAN_EX  '全角→半角(全角ひらがな→半角カタカナも含む)
End Enum


'---------------------------------------------------------------------------
' 関数名 : StrConvEx
' 機  能 : 文字コードを変換する
' 引  数 : (in)SrcText  … 変換対象文字列
'           (in)ConvFlag … 変換指定フラグ
' 返り値 : 変換された文字列
'---------------------------------------------------------------------------
Public Function StrConvEx(ByVal SrcText As String, ByVal ConvFlag As StrConvValue) As String
    Dim ConvTextBuff As String
    Dim MapFlag As Long
    Dim LocalID As Long   'ロケールID

    '文字列バッファを確保(半角→全角の時は2倍)
    ConvTextBuff = String$(lstrlen(SrcText) * IIf(ConvFlag = HAN_TO_ZEN, 2, 1), Chr$(0))

    Select Case ConvFlag
        Case LOW_TO_UPPER    '小文字→大文字
            MapFlag = LCMAP_UPPERCASE
        Case UPPER_TO_LOW    '大文字→小文字
            MapFlag = LCMAP_LOWERCASE
        Case ZEN_TO_HAN      '全角→半角
            MapFlag = LCMAP_HALFWIDTH
        Case HAN_TO_ZEN      '半角→全角
            MapFlag = LCMAP_FULLWIDTH
        Case HIR_TO_KAT      '全角ひらがな→全角カタカナ
            MapFlag = LCMAP_KATAKANA
        Case KAT_TO_HIR      '全角カタカナ→全角ひらがな
            MapFlag = LCMAP_HIRAGANA
        Case ZEN_TO_HAN_EX   '全角→半角(全角ひらがな→半角カタカナも含む)
            MapFlag = LCMAP_KATAKANA Or LCMAP_HALFWIDTH
    End Select

    'ロケールIDを取得
    LocalID = GetSystemDefaultLCID()

    '文字列変換
    Call LCMapString(LocalID, MapFlag, SrcText, -1, ConvTextBuff, Len(ConvTextBuff))
    
    'NULL削除
    StrConvEx = strNullCut(ConvTextBuff)
End Function

'---------------------------------------------------------------------------
'  関数名 : strNullCut
'  機  能 : 文字列を vbNullChar までを取得する
'  引  数 : (in) srcStr … 対象文字列
'  返り値 :編集された文字列
'---------------------------------------------------------------------------
Public Function strNullCut(ByVal srcStr As String) As String
    Dim NullCharPos As Integer

    NullCharPos = InStr(srcStr, Chr$(0))

    If NullCharPos = 0 Then
        strNullCut = srcStr
        Exit Function
    End If

    strNullCut = Left$(srcStr, NullCharPos - 1)
End Function

戻る