Powershell Inrigg-WebRequest และการเข้ารหัสอักขระ

ฉันกำลังพยายามรับข้อมูลจากฐานข้อมูล Spotify ผ่าน Web API อย่างไรก็ตาม ฉันกำลังประสบปัญหาเกี่ยวกับสระเน้นเสียง (ä,ö,ü ฯลฯ)

ให้เรายกTiëstoเป็นตัวอย่าง เบราว์เซอร์ API ของ Spotify สามารถแสดงข้อมูลได้อย่างถูกต้อง: https://developer.spotify.com/web-api/console/get-artist/?id=2o5jDhtHVPhrJdv3cEQ99Z

ถ้าฉันทำการเรียก API ด้วย Invoke-Webrequest ฉันจะได้รับ

ติ??สตอ

เป็นชื่อ:

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
}

ป้อนคำอธิบายรูปภาพที่นี่

ฉันจะได้รับชื่อที่ถูกต้องได้อย่างไร?


person Solaflex    schedule 23.12.2017    source แหล่งที่มา
comment
ปัญหาคือ Spotify ไม่ส่งคืนการเข้ารหัสที่ใช้ในส่วนหัว (โดยไม่ฉลาด) PowerShell ปฏิบัติตามมาตรฐานโดยถือว่า ISO-8859-1 แต่น่าเสียดายที่ไซต์ใช้ UTF-8 (PowerShell ควรเพิกเฉยมาตรฐานที่นี่และรับ UTF-8 แต่นั่นก็เป็นเช่นนั้นเพื่อน) รายละเอียดเพิ่มเติม ที่นี่ พร้อมด้วยตั๋วติดตามผล วิธีแก้ปัญหาที่เป็นไปได้ที่นี่ (แต่น่าเสียดายที่วิธีแก้ปัญหาเกี่ยวข้องกับการละทิ้ง Invoke-WebRequest)   -  person Jeroen Mostert    schedule 23.12.2017
comment
ขอบคุณเจโรน ฉันคาดหวังสิ่งนี้อยู่แล้ว อย่างไรก็ตาม ฉันสันนิษฐานว่า Invivo-WebRequest จะมีพารามิเตอร์สำหรับสิ่งนี้ ฉันจะลองวิธีแก้ปัญหาของคุณ จะรายงานกลับเร็ว ๆ นี้   -  person Solaflex    schedule 23.12.2017


คำตอบ (2)


Jeroen Mostert ในความคิดเห็นเกี่ยวกับคำถาม อธิบายปัญหาได้ดี:

ปัญหาคือ Spotify ไม่ส่งคืนการเข้ารหัสที่ใช้ในส่วนหัว (โดยไม่ฉลาด) PowerShell ปฏิบัติตามมาตรฐานโดยถือว่า ISO-8859-1 แต่น่าเสียดายที่ ไซต์ใช้ UTF-8 (PowerShell ควรเพิกเฉยมาตรฐานที่นี่และรับ UTF-8 แต่นั่นก็เป็นเช่นนั้นเพื่อน) รายละเอียดเพิ่มเติม ที่นี่ พร้อมด้วยตั๋วติดตามผล

วิธีแก้ปัญหาชั่วคราว ที่ไม่จำเป็นต้องใช้ไฟล์ชั่วคราวคือเข้ารหัสสตริงที่อ่านไม่ถูกต้องอีกครั้ง

หากเราถือว่ามีฟังก์ชัน 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)

person mklement0    schedule 24.12.2017

ปัญหาได้รับการแก้ไขด้วยวิธีแก้ปัญหาโดย 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
person Solaflex    schedule 23.12.2017