全角文字が大量に含まれているとなぜか例外が出る

PowerShell 7 で日誌をgrepするとエラーで落ちることがあって、何でだろうと思い調べたら、どうもバグっぽい。

全角文字が画面バッファーの幅以上に含まれていると例外が出る。

$Host.UI.RawUI.BufferSize.Width
# 160

"`u{5b57}" * 159 | Out-File foo.txt
Select-String "`u{5b57}" foo.txt
# foo.txt:1:字字字字字字字字字字字字字字 ...

"`u{5b57}" * 160 | Out-File bar.txt
Select-String "`u{5b57}" bar.txt
# out-lineoutput: startIndex cannot be larger than length of string. (Parameter 'startIndex')

f:id:itasuke:20210723144734p:plain

ASCIIならいくら含まれていても問題なし。一行に含まれている全角文字の数だけが問題。

"xxx `u{5b57} xxx " * 159 | Out-File foo.txt
Select-String "`u{5b57}" foo.txt
# foo.txt:1:xxx 字 xxx xxx 字 xxx xxx 字 xxx ...

"xxx `u{5b57} xxx " * 160 | Out-File bar.txt
Select-String "`u{5b57}" bar.txt
# out-lineoutput: startIndex cannot be larger than length of string. (Parameter 'startIndex')

f:id:itasuke:20210723144732p:plain

回避法

手動で文字列化してください。こんな感じ。

"`u{5b57}" * 160 | Out-File bar.txt
Select-String "`u{5b57}" bar.txt | Out-String
# bar.txt:1:字字字字字字字字字字字字字字 ...

f:id:itasuke:20210723144729p:plain

おわり🌱

去年の時点で似ような報告が上がってるから、ま、すぐに直ると思うけどね。
github.com