Похоже, что кодировка символов исходного текста была неверно истолкована, когда текст был преобразован в строки .NET.
В частности, выглядит так, как будто текст в кодировке UTF-8 был неверно истолкован как «ANSI» -кодированный или, в контексте командлетов, таких как Invoke-WebRequest
, как аналогичное однобайтовое кодирование с фиксированной шириной, такое как ISO-8859-1 , так что каждый байт на входе UTF-8 стал самостоятельным символом, даже если UTF-8 кодирует не-ASCII-диапазон символы как несколько байт.
Чтобы исправить эту проблему, вы должны перекодировать строку :
преобразовать неверно интерпретированную строку обратно в байты, используя ошибочно примененную кодировку входной строки, чтобы получить исходное представление байта.
и затем преобразовать эти байты обратно в строку, используя кодировку true , а именно UTF-8.
# Note: Works in Windows PowerShell only - in PowerShell Core,
# [Text.Encoding]::Default is *invariably* UTF-8.
$originalBytes = [Text.Encoding]::Default.GetBytes('é')
[Text.Encoding]::Utf8.GetString($originalBytes)
Вышеуказанные выходы é
.
В Windows PowerShell [Text.Encoding]::Default
- это кодировка вашей системы "ANSI"; для кодировки ISO-8859-1 используйте [Text.Encoding]::GetEncoding(28591)
Обратите внимание, что вся проблема не возникла бы в PowerShell Core , который по умолчанию последовательно (без спецификации) UTF-8 .
Если вам нужно использовать кодировку «ANSI» даже в PowerShell Core, см. этот ответ .