Проблемы с кодировкой Powershell в памяти - PullRequest
0 голосов
/ 30 октября 2018

Я анализирую некоторый текст XML через API без сохранения фактического файла и столкнулся с проблемой, когда текст содержит символы из других языков.

Когда я пытаюсь преобразовать 'ë' или что-то подобное, я получаю вместо этого текст Ã ©. Есть ли способ изменить кодировку переменной в памяти, поскольку я не использую никаких файлов.

Любая помощь будет принята с благодарностью.

1 Ответ

0 голосов
/ 30 октября 2018

Похоже, что кодировка символов исходного текста была неверно истолкована, когда текст был преобразован в строки .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, см. этот ответ .

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...