プログラミング・ノウハウ集 〜 Visual Basic 編 (1)

全角・半角を意識して、一定長で文字列を切るには

プログラム内部ではUnicodeを使っているのでそれほど全角・半角を意識する必要はありませんが、画面に表示するときや印刷するとき、全角文字は半角文字の2倍のスペースをとります。その関係で、決まった幅に収まるように文字列を表示するために、決まった場所で文字列を「切る」必要があります。
しかし、もともとの文字がUnicodeである関係で、そのまま文字列を切っても思ったようなところで区切れません。
そこで、一旦ASCIIに変換してから文字列を切るということが必要になりますが、それでも、切る場所を考えないと、最後の文字が2バイト文字の1バイト目に当たってしまい、その箇所が「・」のように表示されてしまいます。
そこで、そのあたりも考慮したプログラムに仕上げる必要が生じます。

サンプルプログラム


Attribute VB_Name = "mdlStrCutterASCII"
Option Explicit
'文字列の右側を指定されたバイト数の個所で切り取る。(左側を残す)
'指定された文字列を、ASCIIコードで言うところの1バイト文字と2バイト文字を考慮に入れて
'指定されたバイト長を超えず、最後の文字が2バイト文字の1バイト目文字にならないように、
'左側を残して切り取る
' (例) getStrByLenLeft("あいうえお", 4) → "あい"
'     getStrByLenLeft("あいうえお", 7) → "あいう" (7バイト目が2バイト文字"え"の1バイト目文字に当たるため)
'     getStrByLenLeft("12345あいうえお", 7) → "12345あ"
'     getStrByLenLeft("12345あいうえお", 6) → "12345" (6バイト目が2バイト文字"あ"の1バイト目文字に当たるため)
Public Function getStrByLenLeft(ByVal strSrc As String, ByVal intLen As Integer)

    Dim strBuff As String   '変換途中の文字列

    '指定バイト長に切り取る
    strBuff = StrConv(strSrc, vbFromUnicode)    '指定された文字列を一旦ASCIIコードに変換する
    strBuff = LeftB(strBuff, intLen)            'ASCIIコードのまま指定されたバイト長に切り取る
    strBuff = StrConv(strBuff, vbUnicode)       '切り取った文字列をUniCodeに戻す

    '2バイト文字の1バイト目文字チェック
    '最終文字が2バイト文字の1バイト目文字ならば、その1文字も切り取る
    If Right(strBuff, 1) <> Mid(strSrc, Len(strBuff), 1) Then
        strBuff = Left(strBuff, Len(strBuff) - 1)
    End If

    '得られた文字列を返す
    getStrByLenLeft = strBuff

End Function
'文字列を指定された個所から指定されたバイト数の個所で切り取る。
'指定された文字列を、ASCIIコードで言うところの1バイト文字と2バイト文字を考慮に入れて
'指定された個所から指定されたバイト長を超えず、最初の文字が2バイト文字の2バイト目文字にならないように切り取る
'指定された個所の文字が2バイト文字の2バイト目文字に当たる場合、その文字は切捨て、次の文字からを残す対象とする。
' (例) getStrByLenRight("あいうえお", 3, 4) → "いう"
'     getStrByLenRight("あいうえお", 3, 7) → "いうえ" (3バイト目から起算して7バイト目に当たる文字が2バイト文字"お"の1バイト目文字に当たるため)
'     getStrByLenRight("あいうえお", 4, 5) → "うえ" (4バイト目が2バイト文字の2バイト目文字に当たるので、5バイト目文字"う"の前は切り取る。そこから起算して5バイト目に当たる文字が2バイト文字"お"の1バイト目文字に当たるため)
'     getStrByLenRight("12345あいうえお12345", 5, 12) → "5あいうえお1"
'     getStrByLenRight("12345あいうえお12345", 2, 11) → "2345あいう" (2バイト目から起算して11バイト目に当たる文字が2バイト文字"え"の1バイト目文字に当たるため)
'     getStrByLenRight("12345あいうえお12345", 7, 4) → "いう" (7バイト目が2バイト文字"あ"の2バイト目文字に当たるので、8バイト目文字"い"の前は切り取る。そこから起算して4バイト分を取得する)
Public Function getStrByLenMid(ByVal strSrc As String, ByVal intPos As Integer, ByVal intLen As Integer)

    Dim strBuff     As String   '変換途中の文字列
    Dim intStrLen   As Integer  '指定された文字列のバイト長

    '指定された文字列をASCIIコードの変換後、そのバイト長を求める
    intBuffLen = LenB(StrConv(strSrc, vbFromUnicode))

    strBuff = getStrByLenRight(strSrc, intStrLen - intPos + 1)
                                                '指定された文字列の指定された個所以降の文字列を取得する
    strBuff = getStrByLenLeft(strBuff, intLen)  '上で求めた文字列の左側のバイト数を指定して、右側文字を切り取った結果を取得する

    '得られた文字列を返す
    getStrByLenMid = strBuff

End Function
'文字列の左側を指定されたバイト数の個所で切り取る。(右側を残す)
'指定された文字列を、ASCIIコードで言うところの1バイト文字と2バイト文字を考慮に入れて
'指定されたバイト長を超えず、最初の文字が2バイト文字の2バイト目文字にならないように、
'右側を残して切り取る
' (例) getStrByLenRight("あいうえお", 4) → "えお"
'     getStrByLenRight("あいうえお", 7) → "うえお" (最後から7バイト目が2バイト文字"い"の2バイト目文字に当たるため)
'     getStrByLenRight("あいうえお12345", 7) → "お12345"
'     getStrByLenRight("あいうえお12345", 6) → "12345" (最後から6バイト目が2バイト文字"お"の2バイト目文字に当たるため)
Public Function getStrByLenRight(ByVal strSrc As String, ByVal intLen As Integer)

    Dim strBuff As String   '変換途中の文字列

    '指定バイト長に切り取る
    strBuff = StrConv(strSrc, vbFromUnicode)    '指定された文字列を一旦ASCIIコードに変換する
    strBuff = RightB(strBuff, intLen)           'ASCIIコードのまま指定されたバイト長に切り取る
    strBuff = StrConv(strBuff, vbUnicode)       '切り取った文字列をUniCodeに戻す

    '2バイト文字の2バイト目文字チェック
    '最初の文字が2バイト文字の2バイト目文字ならば、その1文字も切り取る
    If Left(strBuff, 1) <> Mid(strSrc, Len(strSrc) - Len(strBuff) + 1, 1) Then
        strBuff = Right(strBuff, Len(strBuff) - 1)
    End If

    '得られた文字列を返す
    getStrByLenRight = strBuff

End Function


Back「プログラミング・ノウハウ集」に戻る
Topトップページに戻る