我正试图通过他们的Web从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
}
我怎么才能得到正确的名字?
发布于 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
(请参阅下面),您可以使用以下方法:
# ConvertTo-BodyWithEncoding defaults to UTF-8.
$JSON = Invoke-WebRequest -Uri $URI ... | ConvertTo-BodyWithEncoding
方便函数ConvertTo-BodyWithEncoding
注意:
[System.Text.Encoding]
实例、代码页号(例如1251
)或编码名称(例如'utf-16le
)。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()
)
}
}
发布于 2017-12-23 14:10:57
问题由杰隆·莫斯特提供的解决办法解决。您必须将它保存在一个文件中,并明确告诉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
https://stackoverflow.com/questions/47952689
复制相似问题