Powershell Invoke-WebRequest和字符编码

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Powershell Invoke-WebRequest和字符编码相关的知识,希望对你有一定的参考价值。

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

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

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

在??

作为名称:

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

我怎样才能得到正确的名字?

答案

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

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

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

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

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

有关函数的定义,请参见下文。


Utility function convertFrom-MisinterpretedUtf8:

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

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

另一答案

问题通过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

以上是关于Powershell Invoke-WebRequest和字符编码的主要内容,如果未能解决你的问题,请参考以下文章

powershell PowerShell:启动PowerShell作为其他用户提升

powershell [提示输入powershell] #powershell #input #prompt

powershell 测量PowerShell命令或PowerShell脚本的速度

powershell远程下载exe并执行

powershell 使用啥端口

powershell PowerShell使用PowerShell创建本地管理员帐户