DOBON.NET プログラミング道: .NET Framework, VB.NET, C#, Visual Basic, Visual Studio, インストーラ, ...

文字列の長さ(文字数)を取得する

文字列(String型)の長さ(文字数)を取得するには、String.Lengthプロパティを使います。

VB.NET
コードを隠すコードを選択
Dim s As String = "こんにちは。"

'sがNothingでないことを確認
If Not s Is Nothing Then
    '文字数を取得
    Dim len As Integer = s.Length

    '結果を表示
    '「こんにちは。」は 6文字 です
    Console.WriteLine("「{0}」は {1}文字 です", s, len)
End If
C#
コードを隠すコードを選択
string s = "こんにちは。";

//sがnullでないことを確認
if (s != null)
{
    //文字数を取得
    int len = s.Length;

    //結果を表示
    Console.WriteLine("「{0}」は {1}文字 です", s, len);
    //「こんにちは。」は 6文字 です
}

VB.NETでは、Len関数を使うこともできます。Len関数は、与えられたパラメータがNothingの時に0を返す以外は、String.Lengthプロパティと同じです。

なお、VB6のLenB関数のように、半角文字を1バイト、全角文字を2バイトとして文字列の長さをバイト数で取得する方法は、「VB6のLenBと同じ事を行うには?」で説明しています。

サロゲートペアや結合文字列を1文字として長さを取得する

String.Lengthプロパティは、Stringオブジェクトに含まれているCharオブジェクトの数(StringオブジェクトのCharsプロパティが返すChar型配列の長さ)を返します。よって、2つ以上のCharオブジェクトで1つの文字を表すサロゲートペア(代用対)や結合文字列(Combining Character Sequence、組み合わせ文字シーケンス)が含まれている場合は、正しいUnicode文字数を返しません。

補足:サロゲートペアと結合文字列については、「サロゲートペアや結合文字が含まれているか調べる」で説明しています。

このような文字列でも正しいUnicode文字数を取得するには、StringInfoクラス(System.Globalization名前空間)のLengthInTextElementsプロパティを使います。

以下の例では、LengthInTextElementsプロパティを使用してUnicode文字数を取得し、その結果をString.Lengthプロパティと比較しています。

VB.NET
コードを隠すコードを選択
'結合文字列を含む文字列
Dim s As String = "a" & ChrW(&H301) & "a" & ChrW(&H302) & "a" & _
    ChrW(&H303) & "a" & ChrW(&H304) & "a" & ChrW(&H305)
'StringInfoオブジェクトを作成
Dim si As New System.Globalization.StringInfo(s)

'文字数を取得
Dim len As Integer = si.LengthInTextElements
'結果を表示
Console.WriteLine("StringInfo.LengthInTextElements では {0}", len)
'StringInfo.LengthInTextElements では 5

'String.Lengthと比較する
Console.WriteLine("String.Length では {0}", s.Length)
'String.Length では 10
C#
コードを隠すコードを選択
//結合文字列を含む文字列
string s = "a\u0301a\u0302a\u0303a\u0304a\u0305";
//StringInfoオブジェクトを作成
System.Globalization.StringInfo si = new System.Globalization.StringInfo(s);

//文字数を取得
int len = si.LengthInTextElements;
//結果を表示
Console.WriteLine("StringInfo.LengthInTextElements では {0}", len);
//StringInfo.LengthInTextElements では 5

//String.Lengthと比較する
Console.WriteLine("String.Length では {0}", s.Length);
//String.Length では 10

LengthInTextElementsプロパティは.NET Framework 2.0以降でしか使用できません。.NET Framework 1.1以前では、StringInfo.ParseCombiningCharactersメソッドが返す配列の要素数が正しいUnicode文字数となります。

VB.NET
コードを隠すコードを選択
'結合文字列を含む文字列
Dim s As String = "a" & ChrW(&H301) & "a" & ChrW(&H302) & "a" & _
    ChrW(&H303) & "a" & ChrW(&H304) & "a" & ChrW(&H305)

'sがNothingでないことを確認
If Not s Is Nothing Then
    Dim indexes As Integer() = _
        System.Globalization.StringInfo.ParseCombiningCharacters(s)
    '文字数を取得
    Dim len As Integer = indexes.Length
    '結果を表示
    '5文字
    Console.WriteLine("{0}文字", len)
End If
C#
コードを隠すコードを選択
//結合文字列を含む文字列
string s = "a\u0301a\u0302a\u0303a\u0304a\u0305";

//sがnullでないことを確認
if (s != null)
{
    int[] indexes = System.Globalization.StringInfo.ParseCombiningCharacters(s);
    //文字数を取得
    int len = indexes.Length;
    //結果を表示
    Console.WriteLine("{0}文字", len);
    //5文字
}

注意:この記事では、基本的な事柄の説明が省略されているかもしれません。初心者の方は、特に以下の点にご注意ください。

  • .NET Tipsをご利用いただく際は、注意事項をお守りください。