日本語のwebページをInvoke-WebRequest
したときに文字化けしていた場合の対処方法
- Invoke-RestMethodの文字化け対策 - or1ko's diary
-
gooラボ 形態素解析APIを試してみる - pierre3のブログ
- 「レスポンスのエンコーディングについて」の項
コード
$resp = Invoke-WebRequest $url
このときの$resp.Content
が文字化けしていた場合の対処方法
本来のエンコードがUTF8の場合
[System.Text.Encoding]::UTF8.GetString( [System.Text.Encoding]::GetEncoding("ISO-8859-1").GetBytes($resp.Content) )
本来のエンコードがShift_JISの場合
[System.Text.Encoding]::GetEncoding("Shift_JIS").GetString( [System.Text.Encoding]::GetEncoding("ISO-8859-1").GetBytes($resp.Content) )
他のエンコードの場合はこれを参考に都度対応を。。
原因
サーバからのレスポンスにcharset
の指定が無いため、らしい。
http://pierre3.hatenablog.com/entry/2014/12/13/001743
Invoke-RestMethod コマンドレットは、レスポンスヘッダ(Content-Type ;charset?) を見てエンコーディングしてくれるようなのですが、 このAPIのレスポンスヘッダにはcharsetの指定が無いようなのです。
その場合ってどうなるの?どうやらcahrsetの指定がない場合は ISO-8859-1 でエンコーディングされるらしい。
イマドキの一般のwebサイトであればこの対応が必要になることは少ないかもしれないが、社内向けの手作り感満載のお知らせ一覧をスクレイピングするとき等に知っていると良いかも。
Invoke-RestMethodの場合
これは上記処理無しでレスポンスボディ部分をオブジェクトとして変換済みになってしまっているので、Invoke-WebRequest
を使うようにしてエンコード変換を行い、その結果をConvertFrom-Json
でJSON形式文字列をオブジェクトに変換してやればOK