文字列のバイト数を確認する(入力値確認 1)

2022年2月8日火曜日

VB.NET 文字列操作

t f B! P L
システム内の登録画面等で入力された情報を変数へ格納する前や
データベースへ登録する前などに入力された文字数が指定の範囲内か?
数値として認識できるか?日付として認識できて指定の範囲内か?など
入力値のチェックが頻繁に必要になります。
データベースへの登録などが必要なシステムでは必須といってよいでしょう。

こういった頻繁に使用する処理は一つの関数やクラスとして一度作成しておけば
複数のシステムで使いまわしができますので、作成しておいて損はないプログラムかと思います。
まず第一弾として入力された、文字数が指定の範囲内に収まっているかをチェックする方法を
サンプルを用いて御紹介します。

文字数をカウントする方法としては単純な文字数ではなくバイト数でのカウントが
必要となるケースがあります。
データベースの登録先の項目が文字列型の場合、
登録できるデータの長さはバイト数で指定しておくことになりますので
単純な文字数ではなくバイト数で確認することが必要となります。

ではサンプルを見てみましょう
まず文字数をカウントする関数としては「Len」関数が存在します。
ただし、このLen関数ではひらがなや漢字などの2バイトの文字も
文字数としては「1」とカウントしてしまいます。

Len("あいうえお")        '戻り値は5

これでは入力された文字列のバイト数が正確に確認でません。
またVB.Netにはエクセルの「LenB」のような関数も存在しません。
対処法の一例として入力された文字列のバイト数を確認するには
「GetByteCount」メソッドを使用します。

System.Text.Encoding.GetEncoding("Shift_JIS").GetByteCount("あいうえお")       '戻り値は10

これは"あいうえお"という文字列をShift_JISにエンコードした際のバイト数が返されます。
このプログラムの戻り値を確認するとひらがなが2バイトとして「10」とカウントされます。
GetByteCountで入力された文字列のバイト数を確認することができました。

注意点として現在の最新の.Net6等ではエンコード方法に「Shift_JIS」を
選択することはできません。そこでWindowsに設定されているエンコード方法を
参照できるよう登録しておく必要がございます。
下記の「RegisterProvider」を呼び出すことで「Shift_JIS」を使用することが可能となります。
'エンコード方法取得
System.Text.Encoding.RegisterProvider(CodePagesEncodingProvider.Instance)

これを登録画面等で入力された文字列に対し確認していけばよいのですが、
入力する項目が多い場合1ヶ所づつ確認するのではプログラミングが大変です。
そこで関数やクラスに処理を記述しておくと、
複数のシステムで使いまわしも可能で効率的にプログラミングできるかと思います。
では関数にまとめた処理を見てみましょう。

Public Function funLenB(pstrText As String, pintMin As Integer, pintMax As Integer) As Integer

    Dim intByte As Integer

    'エンコード方法取得
    System.Text.Encoding.RegisterProvider(CodePagesEncodingProvider.Instance)

    'Shift_JISにエンコードしたバイト数取得
    intByte = System.Text.Encoding.GetEncoding("Shift_JIS").GetByteCount(pstrText)

    'バイト数が最小値に満たない場合
    If intByte < pintMin  Then
        Return 1
    End If 

    'バイト数が最大値を超える場合
    If intByte > pintMax Then
        Return 2
    End If 

    '指定範囲内の場合
    Return -1

End Function

引数 pstrText - 確認したい文字列
引数 pintMin - 指定範囲最小値
引数 pintMax - 指定範囲最大値

戻り値
指定範囲の最小値よりバイト数が小さい(=指定文字数に満たない)場合 1
指定範囲の最大値よりバイト数が大きい(=指定文字数を超える)場合 2
指定範囲内の場合 -1

保存ボタンを押された場合など確認が必要なタイミングで入力された文字列と
文字数の範囲を指定し関数を呼び出すと範囲内かどうか確認することができます。
所の戻り値を元にメッセージなどを表示すると使用者にわかりやすいかと思います。

同じ処理をクラス化してみましょう
Public Class clsLenB
    Public Property pstrText As String
    Public Property pintMin As Integer
    Public Property pintMax As Integer

    'メソッドの作成
    Public Function CheckChar() As Integer
        Dim intByte As Integer

        'エンコード方法取得
        System.Text.Encoding.RegisterProvider(CodePagesEncodingProvider.Instance)

        'Shift_JISにエンコードしたバイト数取得
     intByte = System.Text.Encoding.GetEncoding("Shift_JIS").GetByteCount(pstrText)

        If intByte < pintMin Then
            Return 1
        End If

        If intByte > pintMax Then
            Return 2
        End If

        Return -1
    End Function
End Class

関数での処理の違いは引数の代わりにプロパティに確認する文字列や
文字数の範囲を指定します。
実際チェックを行なう処理をメソッドとして作成しておきます。

このような文字列の長さを確認する処理は様々なシステムで
使用することができますので、
一つ作成しておくと便利かと思います。

他にもいろいろと方法もございますし、
開発するシステムによっては、よりふさわしい方法もあるかと思いますが、
御参考にしていただければと思います。
サンプルはVB.NETで作成しておりますが、
考え方はどんな言語でも同じですので、
参考にしていただければと思います。

QooQ