Проблема специальных символов кодировки Powershell ConvertFrom-Json
У меня есть этот код в моем скрипте 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 ответа
Полезный ответ Питера Шнайдера и полезный ответ Наса решают одну проблему с вашим подходом: Вам необходимо:
либо: доступ к
.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):
Желательно изменить веб-сервис, чтобы включить
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"
Использование 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"
Попробуйте преобразовать значение .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