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です。

PowerShell