問題点
PowerShellのInvoke-WebRequestでcharsetがutf-8に設定されているページを読込むと日本語部分が文字化けして「????」となるため、正しく日本語の処理ができません。
$res = Invoke-WebRequest -Uri $uri
$content = $res.Content
# 以降、$contentに対して、文字列検索や、正規表現で部分文字列の取り出し処理など。
$matches = [RegEx]::Matches($content, "href=""(http:\/\/www\.example\.com\/項目[a-z0-9]{20}\.html)""")
参考にした記事
この問題について、以下の記事を参考にさせて頂きました。
この中にある「本来のエンコードがUTF8の場合」というコードです。あらためて引用させて頂きます。
[System.Text.Encoding]::UTF8.GetString( [System.Text.Encoding]::GetEncoding("ISO-8859-1").GetBytes($resp.Content) )
これは ISO-8859-1 ⇒ UTF-8 の変換と理解しています。(間違っていればご指摘ください)
改善策
ところが上記のコードでも日本語部分が「????」となるため、以下のように書き換えてみたところ文字化けが解消しました。
$content = [System.Text.Encoding]::UTF8.GetString( [System.Text.Encoding]::GetEncoding("UTF-8").GetBytes($res.Content) )
このコードは UTF-8 ⇒ UTF-8 という意味のない処理をしているように見えるのですが、結果として問題は解決しました。
解消した理由までは理解できていませんが、Tipsとして書いておきます。