Проблема специальных символов кодировки Powershell ConvertFrom-Json - PullRequest
0 голосов
/ 28 октября 2018

У меня есть этот код в моем скрипте 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 голосов
/ 28 октября 2018

Используйте Invoke-RestMethod, если вам нужны только данные json без ParsedHtml, Headers и других объектов, возвращаемых 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"
0 голосов
/ 28 октября 2018

Полезный ответ Питера Шнайдера и Полезный ответ Nas оба адреса один проблема с вашим подходом: Вам необходимо:

  • any: получить доступ к свойству .Content объекта ответа, возвращаемого Invoke-WebRequest, чтобы получить фактические данные , возвращаемые (в виде строки JSON), которые затем можно передать ConvertFrom-Json.

  • или: используйте взамен Invoke-RestMethod, который возвращает данные напрямую и анализирует их в пользовательских объектах , поэтому вы можете работать с нимиобъекты напрямую, без необходимости ConvertTo-Json;однако, с проблемой кодировки символов, такой как в данном случае, это , а не вариант, поскольку необходимо явное перекодирование строки JSON - см. ниже.

Тем не менее, в Windows PowerShell у вас все еще есть кодировка символов проблема , поскольку при отсутствии информации charset в ответе Заголовок , PowerShell интерпретирует строку JSON в кодировке UTF-8, возвращаемую как ISO-8859-1 .
(PowerShell Core ,напротив, по умолчанию для UTF-8).

Существует два возможных решения (кроме переключения на PowerShell Core ):

  • Желательно изменить веб-службу, включив в поле ContenType заголовка ответа charset=utf-8.

  • Если вы не можете этого сделать, вы должны явноперекодировать полученную строку , чтобы исправить неверную интерпретацию кодировки символов.

Вот инструментДействие последнего:

$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"
0 голосов
/ 28 октября 2018

Попробуйте преобразовать значение свойства .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
...