2
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 1 year has passed since last update.

PowerShell でもサロゲートペア文字・結合文字列を正しく数えたい

Last updated at Posted at 2023-06-21

PowerShell では内部的に UTF-16LE を利用しています。そのため、Windows API や Java を利用した開発と同様、文字列を取り扱う際にはサロゲートペア文字に関する問題を考慮しなければなりません。

String.Length で文字数を数えてみる

まずは素直に String.Length で文字数を数えてみましょう:

基本多言語面内(非サロゲートペア文字)
"a".Length
# 1

"あ".Length
# 1
基本多言語面外(サロゲートペア文字)
"🎵".Length
# 2

サロゲートペア文字の場合はハイサロゲート・ローサロゲートで合計2文字のカウントになっていますね。

同様に、結合文字列についても確認してみましょう:

結合文字列
"ぬ゙".Length
# 2 (1+1)

"👨🏻‍🎤".Length
# 7 (2+2+1+2)

結合に利用した分の文字数(サロゲートペア文字の場合は2文字として)でカウントされていますね。

なお、PowerShell には Linux 版もリリースされていますが、こちらでも同じ挙動となります。

$ docker run --rm mcr.microsoft.com/powershell:lts-7.2-debian-buster-slim pwsh -Command '"👨🏻‍🎤".Length'
7

StringInfo.LengthInTextElements で文字数を数えてみる

System.Globalization.StringInfo はサロゲートペア文字や結合文字列を考慮しながら文字列を取り扱うためのクラスです。コンストラクタでインスタンスを生成した後、LengthInTextElements プロパティで以下の要素数を数えます:

  • 基本文字
  • サロゲートペア文字
  • 結合文字列
[System.Globalization.StringInfo]::new("👨🏻‍🎤<ぬ゙~🎵").LengthInTextElements
# 5

やったね。期待通り 5 文字として数えることができました!

参考リンク

2
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
2
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?