首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >Powershell调用-WebRequest和字符编码

Powershell调用-WebRequest和字符编码
EN

Stack Overflow用户
提问于 2017-12-23 12:57:19
回答 2查看 7.6K关注 0票数 2

我正试图通过他们的Web从Spotify数据库获取信息。然而,我正面临重音元音的问题(如,音、音、音等)。

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

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

提?

姓名:

代码语言:javascript
运行
复制
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
}

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

EN

回答 2

Stack Overflow用户

发布于 2017-12-24 14:22:10

Update:在HTTP响应头中没有(有效) charset属性的情况下,PowerShell (核心) 7.3+现在默认为UTF-8,因此问题不再出现。

耶伦·莫斯特在对这个问题的评论中很好地解释了这个问题:

问题是Spotify (不明智)没有返回它在其头中使用的编码。PowerShell通过假定ISO-8859-1来遵守标准,但不幸的是,站点使用的是UTF-8.(PowerShell应该忽略这里的标准,假设UTF-8,但这就像,我的观点,伙计。)更详细的这里,以及后续的票。

不需要使用临时文件的解决方案

假设已经定义了函数ConvertTo-BodyWithEncoding (请参阅下面),您可以使用以下方法:

代码语言:javascript
运行
复制
# ConvertTo-BodyWithEncoding defaults to UTF-8.
$JSON = Invoke-WebRequest -Uri $URI ... | ConvertTo-BodyWithEncoding

方便函数ConvertTo-BodyWithEncoding

注意:

  • 该函数手动解码构成给定响应体的原始字节,默认情况下为UTF-8,或者使用给定的编码,可以指定为[System.Text.Encoding]实例、代码页号(例如1251)或编码名称(例如'utf-16le)。
  • 该函数还可以作为 麻省理工学院授权的吉斯特使用,只有后者才能继续使用。假设您已经查看了链接代码以确保它是安全的(我个人可以向您保证,但您应该始终检查),您可以直接定义它,如下所示(将显示如何在以后的会话中使函数可用或如何将其转换为脚本的说明): irm https://gist.github.com/mklement0/209a9506b8ba32246f95d1cc238d564d/raw/ConvertTo-BodyWithEncoding.ps1 \ iex
代码语言:javascript
运行
复制
function ConvertTo-BodyWithEncoding {

  [CmdletBinding(PositionalBinding=$false)]
  param(
    [Parameter(Mandatory, ValueFromPipeline)]
    [Microsoft.PowerShell.Commands.WebResponseObject] $InputObject,
    # The encoding to use; defaults to UTF-8
    [Parameter(Position=0)]
    $Encoding = [System.Text.Encoding]::Utf8
  )

  begin {
    if ($Encoding -isnot [System.Text.Encoding]) {
      try {
        $Encoding = [System.Text.Encoding]::GetEncoding($Encoding)
      }
      catch { 
        throw
      }
    }
  }

  process {
    $Encoding.GetString(
       $InputObject.RawContentStream.ToArray()
    )
  }

}
票数 6
EN

Stack Overflow用户

发布于 2017-12-23 14:10:57

问题由杰隆·莫斯特提供的解决办法解决。您必须将它保存在一个文件中,并明确告诉Powershell它应该使用哪种编码。这个解决方法适用于我,因为我的程序可以占用它所需的任何时间(关于读/写IO)。

代码语言:javascript
运行
复制
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
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/47952689

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档