Powershell Invoke-WebRequest dan pengkodean karakter

Saya mencoba mendapatkan informasi dari database Spotify melalui API Web mereka. Namun, saya menghadapi masalah dengan aksen vokal (ä,ö,ü dll.)

Mari kita ambil Tiësto sebagai contoh. Browser API Spotify dapat menampilkan informasi dengan benar: https://developer.spotify.com/web-api/console/get-artist/?id=2o5jDhtHVPhrJdv3cEQ99Z

Jika saya melakukan panggilan API dengan Invoke-Webrequest saya mengerti

Ini??sto

sebagai nama:

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
}

masukkan deskripsi gambar di sini

Bagaimana saya bisa mendapatkan nama yang benar?


person Solaflex    schedule 23.12.2017    source sumber
comment
Masalahnya adalah Spotify (secara tidak bijaksana) tidak mengembalikan pengkodean yang digunakannya di headernya. PowerShell mematuhi standar dengan mengasumsikan ISO-8859-1, namun sayangnya situs tersebut menggunakan UTF-8. (PowerShell harus mengabaikan standar di sini dan mengasumsikan UTF-8, tapi itu seperti pendapat saya, kawan.) Detail lebih lanjut di sini, beserta tiket tindak lanjutnya. Solusi yang mungkin di sini (tapi sayangnya solusi tersebut melibatkan pengabaian Invoke-WebRequest).   -  person Jeroen Mostert    schedule 23.12.2017
comment
Terima kasih Jeroen. Saya sudah mengharapkan ini. Namun, saya berasumsi bahwa Invoke-WebRequest akan memiliki parameter untuk ini. Saya akan mencoba solusi Anda. akan segera melaporkan kembali.   -  person Solaflex    schedule 23.12.2017


Jawaban (2)


Jeroen Mostert, dalam komentar pada pertanyaan, menjelaskan masalahnya dengan baik:

Masalahnya adalah Spotify (secara tidak bijaksana) tidak mengembalikan pengkodean yang digunakannya di headernya. PowerShell mematuhi standar dengan menerapkan ISO-8859-1, namun sayangnya situs tersebut menggunakan UTF-8. (PowerShell harus mengabaikan standar di sini dan mengasumsikan UTF-8, tapi itu seperti pendapat saya, kawan.) Detail lebih lanjut di sini, beserta tiket tindak lanjutnya.

solusi yang tidak memerlukan penggunaan file sementara adalah dengan mengkodekan ulang string yang salah dibaca.

Jika kita mengasumsikan adanya fungsi convertFrom-MisinterpretedUtf8, kita dapat menggunakan yang berikut ini:

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

Lihat di bawah untuk definisi fungsi.


Fungsi utilitas convertFrom-MisinterpretedUtf8:

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

Fungsi ini mengonversi string yang salah dibaca kembali menjadi byte berdasarkan pengkodean yang salah diterapkan (ISO-8859-1) dan kemudian membuat ulang string berdasarkan pengkodean sebenarnya (UTF-8).

person mklement0    schedule 24.12.2017

Masalah diselesaikan dengan solusi yang diberikan oleh Jeron Mostert. Anda harus menyimpannya dalam file dan secara eksplisit memberi tahu Powershell Encoding mana yang harus digunakan. Solusi ini berhasil bagi saya karena program saya dapat memakan waktu berapa pun yang diperlukan (mengenai baca/tulis 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
person Solaflex    schedule 23.12.2017