Powershell ConvertFrom-Json编码特殊字符发行

时间:2018-10-28 15:40:59

标签: powershell character-encoding invoke-webrequest

我的powershell脚本中包含此代码,并且在特殊字符部分上效果不佳。

 $request = 'http://151.80.109.18:8082/vrageremote/v1/session/players'
 $a = Invoke-WebRequest -ContentType "application/json; charset=utf-8" $request |
 ConvertFrom-Json    |
 Select -expand Data |
 Select -expand players |
 Select displayName, factionTag | Out-file "$scriptPath\getFactionTag.txt"

在我的输出文件中,我只会得到'????'对于任何特殊字符。有谁知道我如何在输出文件中显示特殊字符?

3 个答案:

答案 0 :(得分:3)

Peter Schneider's helpful answerNas' helpful answer都解决了您的方法中的一个问题:您需要:

  • 其中之一:访问.Content返回的响应对象上的Invoke-WebRequest属性,以获取返回的实际数据(作为JSON字符串),您可以然后传递到ConvertFrom-Json

  • 或:改为使用Invoke-RestMethod,它直接返回数据 并将解析为自定义对象,因此您可以直接使用这些对象,无需ConvertTo-Json;但是,对于像这样的字符编码问题,这不是 选项,因为需要对JSON字符串进行明确的重新编码-见下文。

但是, Windows PowerShell 中,您仍然遇到字符编码问题,因为在没有charset信息的情况下在 response 标头中,PowerShell解释以ISO-8859-1编码形式返回的UTF-8编码JSON字符串。
(相比之下,PowerShell Core 默认值为UTF-8)。

有两种可能的解决方案(除了切换到PowerShell Core 之外):

  • 最好将Web服务修改为在响应标头的charset=utf-8字段中包含ContenType

  • 如果无法执行此操作,则必须明确地重新编码收到的字符串,以纠正字符编码的误解。

这是后者的实现:

$request = 'http://151.80.109.18:8082/vrageremote/v1/session/players'
$a = Invoke-WebRequest -ContentType "application/json; charset=utf-8" $request

# $a.Content now contains the *misinterpreted* JSON string, so we must 
# obtain its byte representation and re-interpret the bytes as UTF-8.
# Encoding 28591 represents the ISO-8859-1 encoding - see https://docs.microsoft.com/en-us/windows/desktop/Intl/code-page-identifiers
$jsonCorrected = [Text.Encoding]::UTF8.GetString(
  [Text.Encoding]::GetEncoding(28591).GetBytes($a.Content)
)

# Now process the reinterpreted string.
$jsonCorrected |
  ConvertFrom-Json    |
  Select -expand Data |
  Select -expand players |
  Select displayName, factionTag | Out-file "$scriptPath\getFactionTag.txt"

答案 1 :(得分:1)

尝试将.Content属性的值转换为JSON:

$request = 'http://151.80.109.18:8082/vrageremote/v1/session/players'
$a = Invoke-WebRequest -ContentType "application/json; charset=utf-8" $request

($a.Content | convertfrom-json).Data.Players | select DisplayName,FactionTag | Out-file "$scriptPath\getFactionTag.txt" -Encoding Default

答案 2 :(得分:1)

如果您只需要json数据而没有Invoke-RestMethodParsedHtmlHeaders返回的其他对象,请使用Invoke-WebRequest

$request = 'http://151.80.109.18:8082/vrageremote/v1/session/players'
$a = Invoke-RestMethod -ContentType "application/json; charset=utf-8" $request |
Select -expand Data |
Select -expand players |
Select displayName, factionTag | Out-file "$scriptPath\getFactionTag.txt"