首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Powershell ConvertFrom-Json编码特殊字符问题

Powershell ConvertFrom-Json编码特殊字符问题
EN

Stack Overflow用户
提问于 2018-10-28 23:40:59
回答 3查看 12.6K关注 0票数 2

我的powershell脚本中有这段代码,但它在特殊字符部分做得不好。

代码语言:javascript
复制
 $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"

在我的输出文件中,我只得到‘?’用于任何特殊字符。有人知道如何让它在我的输出文件中显示特殊字符吗?

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2018-10-29 02:05:09

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

JSON

  • :访问Invoke-WebRequest返回的response对象上的.Content属性,以获取返回的实际数据(以JSON字符串的形式),然后可以将其传递给

  • 或:改用Invoke-RestMethod,它直接返回数据并将其解析为自定义对象,因此您可以直接使用这些对象,而不需要ConvertTo-Json;但是,对于字符编码问题,例如在本例中,这不是一个选项,因为需要显式地重新编码JSON字符串-请参见下文。

但是,由于在character-encoding charset响应<>E229<>E130头中缺少信息,PowerShell会将返回的UTF-8编码的JSON字符串解释为编码的(从PowerShell 7.0开始仍然适用)。

有两种可能的解决方案:

  • 最好修改web服务,使其在响应头的ContenType字段中包含charset=utf-8

  • 如果不能这样做,则必须对接收到的字符串进行显式重新编码以更正字符编码的

下面是后者的实现:

代码语言:javascript
复制
$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"
票数 5
EN

Stack Overflow用户

发布于 2018-10-29 00:19:06

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

代码语言:javascript
复制
$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
EN

Stack Overflow用户

发布于 2018-10-29 00:31:24

如果只需要json数据而不需要ParsedHtmlHeadersInvoke-WebRequest返回的其他对象,请使用Invoke-RestMethod

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

https://stackoverflow.com/questions/53033242

复制
相关文章

相似问题

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