文字列(String型)の長さ(文字数)を取得するには、String.Lengthプロパティを使います。
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
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と同じ事を行うには?」で説明しています。
String.Lengthプロパティは、Stringオブジェクトに含まれているCharオブジェクトの数(StringオブジェクトのCharsプロパティが返すChar型配列の長さ)を返します。よって、2つ以上のCharオブジェクトで1つの文字を表すサロゲートペア(代用対)や結合文字列(Combining Character Sequence、組み合わせ文字シーケンス)が含まれている場合は、正しいUnicode文字数を返しません。
補足:サロゲートペアと結合文字列については、「サロゲートペアや結合文字が含まれているか調べる」で説明しています。
このような文字列でも正しいUnicode文字数を取得するには、StringInfoクラス(System.Globalization名前空間)のLengthInTextElementsプロパティを使います。
以下の例では、LengthInTextElementsプロパティを使用してUnicode文字数を取得し、その結果をString.Lengthプロパティと比較しています。
'結合文字列を含む文字列 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
//結合文字列を含む文字列 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文字数となります。
'結合文字列を含む文字列 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
//結合文字列を含む文字列 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文字 }
注意:この記事では、基本的な事柄の説明が省略されているかもしれません。初心者の方は、特に以下の点にご注意ください。