ヘッダー
Visual Basic サンプル集
VB.NET2002対応 VB.NET2003対応 VB2005対応 VB2008対応 VB2010対応 VB2012対応 VB2013対応 VB2015対応 VB2017対応 VB2019対応

文字列に全角文字が含まれているか調べる

2020/6/16

 

 

次のメソッド IsZenkaku を使って文字列に全角文字が1つ以上含まれているか調べることができます。

ここでは全角文字とは ShiftJIS で表現すると2バイト必要な文字を指します。

VB2005対応 VB2008対応 VB2010対応 VB2012対応 VB2013対応 VB2015対応 VB2017対応 VB2019対応 .NET Core / .NET 5以降にも対応

''' <summary>
''' 文字列に全角文字が含まれているか調べる。
''' </summary>
''' <param name="value">調べる対象の文字列。</param>
''' <returns>全角文字が含まれている場合はTrue、そうでない場合False。</returns>
Public Function IsZenkaku(value As String) As Boolean

    If String.IsNullOrEmpty(value) Then
        Return False
    End If

    Dim byteLength As Integer

#If NETCOREAPP Then
    '.NET Core/.NET 5以降の場合
    System.Text.Encoding.RegisterProvider(System.Text.CodePagesEncodingProvider.Instance)
#End If

    byteLength = System.Text.Encoding.GetEncoding("shift_jis").GetByteCount(value)
    Return New System.Globalization.StringInfo(value).LengthInTextElements <> byteLength

End Function
  • .NET Core 2.1 以前で実行する場合、System.Text.Encoding.CodePagesをNuGetからインストールすることが前提です。
  • 半角文字 の場合、 人間が認知する文字数とShiftJISで表現した場合のバイト数が完全一致しますが、それ以外の場合は一致しないということを前提しています。
  • このソースコードとしては.NET Frameworkでも.NET Coreでも.NET 5以降でも使用できますが、コンパイル後はコンパイル時に対象としたフレームワークを前提とします。

 

使用例

IsZenkaku("ABC") → False

IsZenkaku("あいうABC") → True

IsZenkaku("𩸽") → True

IsZenkaku("アイウ") → False

IsZenkaku("🗼") → True

 

備考

ポイント1:サロゲートペア対応

Len や Length で文字列の長さを調べるロジックを使うといわゆるサロゲートペアの文字が半角と判断されてしまいます。

かなりレアな303文字程度の日本の漢字や、もっと多くのレアな中国の漢字、多くの絵文字/変体仮名・古代文字などがこれに該当します。(要するにUnicode追加面に収録されている文字のことです。)

絵文字や古代文字はともかく、漢字の方はまれに苗字で使用されている方がいます。

たとえば、このロジックはほとんどの文字をうまく判断できますが、𩸽 は半角という判定になります。

Public Sub Test()
    If IsZenkakuDame("𩸽") Then
        Debug.WriteLine("𩸽は全角です。")
    Else
        Debug.WriteLine("𩸽は半角です。") '←これが表示されます。
    End If
End Sub

'これは悪い例です!
Public Function IsZenkakuDame(value As String) As Boolean

    If String.IsNullOrEmpty(value) Then
        Return False
    End If

    Dim byteLength As Integer

#If NETCOREAPP Then
    '.NET Core/.NET 5以降の場合
    System.Text.Encoding.RegisterProvider(System.Text.CodePagesEncodingProvider.Instance)
#End If

    byteLength = System.Text.Encoding.GetEncoding("shift_jis").GetByteCount(value)
    Return Len(value) <> byteLength

End Function

.NETが登場したときには、まだいわゆるサロゲートペアというものがなかったので、初期の.NETの全角・半角を判定するサンプルではこの点が考慮されていない場合があります。ご注意ください。(この記事でも2020年6月16日までは考慮しないサンプルを掲載していました。)

ポイント2:.NET Core / .NET 5以降への対応

.NET Core および .NET 5 以降では既定では ShiftJIS が使用できません。ShiftJISを使用できるようにするには Encoding.RegisterProviderメソッドを使って追加のエンコーディングを使えるようにする必要があります。しかし、このメソッドは.NET Frameworkにはないため、.NET Frameworkで記述するとエラーになります。 この記事で紹介する例では #IF NETCOREAPP THEN という条件を付けて、.NET Core および .NET 5 以降の場合のみ、この呼び出しがコンパイルされてるようにしています。


VB6対応 VB6では VB6 文字列に全角文字が含まれているか調べる 参照