Powershell Invoke-WebRequest和字符编码

时间:2017-12-23 12:57:19

标签: json powershell character-encoding spotify

我试图通过他们的Web API从Spotify数据库获取信息。 但是,我面临着带有重音元音的问题(ä,ö,ü等)

让我们以Tiësto为例。 Spotify的API浏览器可以正确显示信息: https://developer.spotify.com/web-api/console/get-artist/?id=2o5jDhtHVPhrJdv3cEQ99Z

如果我使用Invoke-Webrequest进行API调用,我会

  

钛?? STO

名称:

function Get-Artist {
param($ArtistID = '2o5jDhtHVPhrJdv3cEQ99Z',
      $AccessToken = 'MyAccessToken')


$URI = "https://api.spotify.com/v1/artists/{0}" -f $ArtistID

$JSON = Invoke-WebRequest -Uri $URI -Headers @{"Authorization"= ('Bearer  ' + $AccessToken)} 
$JSON = $JSON | ConvertFrom-Json
return $JSON
}

enter image description here

如何获得正确的名称?

2 个答案:

答案 0 :(得分:3)

Jeroen Mostert,在对该问题的评论中,很好地解释了问题:

  

问题是Spotify(不明智地)没有返回它在标题中使用的编码。 PowerShell遵循ISO-8859-1 的标准,但不幸的是该网站使用的是UTF-8 。 (PowerShell应该忽略这里的标准并假设UTF-8,但这就像,我的意见,男人。)更多细节here,以及后续机票。

不需要使用临时文件的解决方法重新编码错误读取的字符串

如果我们假设存在函数convertFrom-MisinterpretedUtf8,我们可以使用以下内容:

$JSON = convertFrom-MisinterpretedUtf8 (Invoke-WebRequest -Uri $URI ...)

请参阅下面的功能定义。

效用函数convertFrom-MisinterpretedUtf8

function convertFrom-MisinterpretedUtf8([string] $String) {
  [System.Text.Encoding]::UTF8.GetString(
     [System.Text.Encoding]::GetEncoding(28591).GetBytes($String)
  )
}

该函数根据错误应用的编码(ISO-8859-1)将错误读取的字符串转换回字节,然后根据实际编码(UTF-8)重新创建字符串。

答案 1 :(得分:1)

问题解决了Jeron Mostert提供的解决方法。 你必须将它保存在一个文件中并明确告诉Powershell它应该使用哪种编码。 这种解决方法对我有用,因为我的程序可以占用它所需的任何时间(关于读/写IO)

function Invoke-SpotifyAPICall {
param($URI,
      $Header = $null,
      $Body = $null
      )

if($Header -eq $null) {
    Invoke-WebRequest -Uri $URI -Body $Body -OutFile ".\SpotifyAPICallResult.txt"    
} elseif($Body -eq $null) {
    Invoke-WebRequest -Uri $URI -Headers $Header -OutFile ".\SpotifyAPICallResult.txt"
}

$JSON = Get-Content ".\SpotifyAPICallResult.txt" -Encoding UTF8 -Raw | ConvertFrom-JSON
Remove-Item ".\SpotifyAPICallResult.txt" -Force
return $JSON

}

function Get-Artist {
    param($ArtistID = '2o5jDhtHVPhrJdv3cEQ99Z',
          $AccessToken = 'MyAccessToken')


    $URI = "https://api.spotify.com/v1/artists/{0}" -f $ArtistID

    return (Invoke-SpotifyAPICall -URI $URI -Header @{"Authorization"= ('Bearer  ' + $AccessToken)})
}


Get-Artist