15
11

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 5 years have passed since last update.

日本語のwebページをInvoke-WebRequestしたときに文字化けしていた場合の対処方法

コード

$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の指定が無いようなのです。
その場合ってどうなるの?

以下にその答えがありました。
https://social.technet.microsoft.com/Forums/windowsserver/en-US/d795e7d2-dcf1-4323-8e06-8f06ce31a897/bug-invokerestmethod-and-utf8-data?forum=winserverpowershell

どうやらcahrsetの指定がない場合は ISO-8859-1 でエンコーディングされるらしい。

イマドキの一般のwebサイトであればこの対応が必要になることは少ないかもしれないが、社内向けの手作り感満載のお知らせ一覧をスクレイピングするとき等に知っていると良いかも。

Invoke-RestMethodの場合

これは上記処理無しでレスポンスボディ部分をオブジェクトとして変換済みになってしまっているので、Invoke-WebRequestを使うようにしてエンコード変換を行い、その結果をConvertFrom-JsonでJSON形式文字列をオブジェクトに変換してやればOK

15
11
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
15
11

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?