Visual Basic サンプル集 |
![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() |
Visual Basic 中学校 > Visual Basic サンプル集 > Visual Basic サンプル集目次 >
文字列に全角文字が含まれているか調べる
2020/6/16
次のメソッド IsZenkaku を使って文字列に全角文字が1つ以上含まれているか調べることができます。
ここでは全角文字とは ShiftJIS で表現すると2バイト必要な文字を指します。
.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
文字列に全角文字が含まれているか調べる 参照