PowerShell: 文字列の長さを取得する Length
PowerShellで文字列の長さを取得するには、 .NET Framework StringクラスのLengthプロパティを使用します。
書式
文字列.Length
LengthはメソッドではなくプロパティなのでLengthの後に()は不要です。
次のサンプルコードではLehgthプロパティを使って、 文字列の長さを取得しています。空文字やNULL($null)の場合は0です。
$a = "abcde" $b = "あいうえお" $c = "" # 空文字 $d = $null # Null $a.Length # 5 $b.Length # 5 $c.Length # 0 $d.Length # 0
参考サイト
String.Length プロパティ (System) | Microsoft Docs
サロゲートペア(特殊な文字)を含む場合の文字列長
レアケースですが、サロゲートペアと呼ばれる特殊な文字を含む場合、 Lengthプロパティでは文字数を上手く取得できません。
通常Unicodeでは1文字を2Byteで表すのですが、 サロゲートペアは1文字を4Bytpで表します。 なので1文字でもLengthプロパティでは2となります。
サロゲートペアの具体例には「𩸽」という漢字があり、ホッケと読みます。 この漢字の文字数をLengthプロパティで取得してみます。
$s = "𩸽" $s.Length # 2
Lengthプロパティの値は2と表示されます。 サロゲートペアを使うケースはあまりありませんが、 このような問題があることを知っておいてください。
サロゲートペアの解決策
サロゲートペアを考慮して文字列の長さを取得する場合は 次のようにロジックを追加します。
$s = "𩸽を買う" $s.Length # 5 何もしない場合 # サロゲートペアの数を取得 $arr = $s -split "[\uD800-\uDBFF][\uDC00-\uDFFF]" $num = $arr.Length - 1 $s.Length - $num # 4 正しく取得できる
-split演算子を使っいる部分は、 サロゲートペアで文字列を配列に分割しています。 次の行でサロゲートペアの数を取得しています。 そして、$s.Lengthの値からサロゲートペアの個数を引くと 正しい文字列の長さが取得できます。 この場合の文字列の長さは4です。