О кодировке символов

Краткое описание

Описывает, как PowerShell использует кодировку символов для ввода и вывода строковых данных.

Подробное описание

Юникод является стандартом кодировки символов по всему миру. Система использует Юникод исключительно для обработки символов и строк. Подробное описание всех аспектов Юникода см. в разделе "Стандартный Юникод".

Windows поддерживает Юникод и традиционные наборы символов. Традиционные наборы символов, такие как кодовые страницы Windows, используют 8-разрядные значения или сочетания 8-разрядных значений для представления символов, используемых в определенных языковых или географических параметрах региона.

В PowerShell по умолчанию используется символ Юникода. Однако несколько командлетов имеют параметр кодировки , который может указывать кодировку для другого символьного набора. Этот параметр позволяет выбрать определенную кодировку символов, необходимую для взаимодействия с другими системами и приложениями.

Следующие командлеты имеют параметр кодировки :

  • Microsoft.PowerShell.Management
    • Add-Content
    • Get-Content
    • Set-Content
  • Microsoft.PowerShell.Utility
    • Export-Clixml
    • Export-Csv
    • Export-PSSession
    • Format-Hex
    • Import-Csv
    • Out-File
    • Select-String
    • Send-MailMessage

Метка порядка байтов

Метка порядка байтов (BOM) — это подпись Юникода в первых нескольких байтах файла или текстового потока, указывающая кодировку Юникода, используемую для данных. Дополнительные сведения см. в документации по байтам по порядку .

В Windows PowerShell любая кодировка Юникода, кроме того UTF7, всегда создает BOM. По умолчанию utf8NoBOM PowerShell (версия 6 и выше) используется для всех текстовых выходных данных.

Для обеспечения оптимальной общей совместимости не используйте boMs в файлах UTF-8. Платформы Unix и служебные программы на основе наследия Unix, которые также используются на платформах Windows, не поддерживают BOM.

Аналогичным образом UTF7 следует избегать кодирования. UTF-7 не является стандартной кодировкой Юникода и записывается без BOM во всех версиях PowerShell.

Создание скриптов PowerShell на платформе, подобной Unix, или с помощью кроссплатформенного редактора в Windows, например Visual Studio Code, приводит к тому, что файл закодирован с помощью UTF8NoBOM. Эти файлы работают нормально в PowerShell, но могут прерывать работу в Windows PowerShell, если файл содержит символы, отличные от Ascii.

Если в скриптах необходимо использовать символы, отличные от Ascii, сохраните их как UTF-8 с помощью BOM. Без BOM Windows PowerShell неправильно интерпретирует скрипт как кодируемый в устаревшей кодовой странице ANSI. И наоборот, файлы, имеющие BOM UTF-8, могут быть проблемными на платформах, таких как Unix. Многие средства Unix, такие как , awksedи некоторые редакторы, такие как catgedit не знают, как лечить BOM.

Кодировка символов в Windows PowerShell

В PowerShell 5.1 параметр кодирования поддерживает следующие значения:

  • Ascii Использует набор символов Ascii (7-разрядный).
  • BigEndianUnicode Использует UTF-16 с порядком байтов больших байтов.
  • BigEndianUTF32 Использует UTF-32 с порядком байтов больших байтов.
  • Byte Кодирует набор символов в последовательность байтов.
  • Default Использует кодировку, соответствующую активной кодовой странице системы (обычно ANSI).
  • Oem Использует кодировку, соответствующую текущей кодовой странице OEM системы.
  • String аналогичен Unicode.
  • Unicode Использует UTF-16 с маленьким порядком байтов.
  • Unknown аналогичен Unicode.
  • UTF32 Использует UTF-32 с маленьким порядком байтов.
  • UTF7 Использует UTF-7.
  • UTF8 Использует UTF-8 (с BOM).

Как правило, Windows PowerShell использует кодировку Юникода UTF-16LE по умолчанию. Однако кодировка по умолчанию, используемая командлетами в Windows PowerShell, не согласована.

Примечание.

При использовании любой кодировки Юникода, кроме того UTF7, всегда создается BOM.

Для командлетов, записывающих выходные данные в файлы:

  • Out-File и операторы > перенаправления и >> создание UTF-16LE, которые, в частности, отличаются от Set-Content и Add-Content.

  • New-ModuleManifest а Export-CliXml также создайте файлы UTF-16LE.

  • Если целевой файл пуст или не существует, Set-Content и Add-Content используйте Default кодировку. Default — это кодировка, указанная устаревшей кодовой страницей ANSI активного языкового стандарта системы.

  • Export-Csv создает Ascii файлы, но использует другую кодировку при использовании параметра Добавления (см. ниже).

  • Export-PSSession по умолчанию создает файлы UTF-8 с BOM.

  • New-Item -Type File -Value создает файл UTF-8 без BOM.

  • Send-MailMessage использует Default кодировку по умолчанию.

  • Start-Transcript создает Utf8 файлы с помощью BOM. Если используется параметр "Добавить", кодировка может отличаться (см. ниже).

Для команд, которые добавляются к существующему файлу:

  • Out-File -Append>> и оператор перенаправления не пытается сопоставить кодировку содержимого существующего целевого файла. Вместо этого они используют кодировку по умолчанию, если параметр кодирования не используется. При добавлении содержимого необходимо использовать исходную кодировку файлов.

  • При отсутствии явного параметра Add-Content кодирования обнаруживает существующую кодировку и автоматически применяет его к новому содержимому. Если существующее содержимое не имеет BOM, Default используется кодировка ANSI. Поведение Add-Content в PowerShell (версии 6 и более поздних версиях), за исключением кодировки Utf8по умолчанию.

  • Export-Csv -Append соответствует существующей кодировке, если целевой файл содержит BOM. В отсутствие BOM используется Utf8 кодировка.

  • Start-Transcript -Append соответствует существующей кодировке файлов, включающих BOM. В отсутствие BOM по умолчанию используется кодировка Ascii . Эта кодировка может привести к потере данных или повреждению символов, если данные в расшифровке содержат многобайтовые символы.

Для командлетов, которые считывают строковые данные в отсутствие BOM:

  • Get-Content и Import-PowerShellDataFile использует кодировку Default ANSI. ANSI также является тем, что использует модуль PowerShell при чтении исходного кода из файлов.

  • Import-Csv, Import-CliXmlи Select-String предположим Utf8 , что в отсутствие BOM.

Кодировка символов в PowerShell

В PowerShell (версии 7.1 и более поздних версиях) параметр кодирования поддерживает следующие значения:

  • ascii: использует кодировку для набора символов ASCII (7-разрядная версия).
  • bigendianunicode: кодирует в формате UTF-16 с помощью порядка байтов больших байтов.
  • bigendianutf32: кодирует в формате UTF-32 с помощью порядка байтов больших байтов.
  • oem: использует кодировку по умолчанию для программ MS-DOS и консольных программ.
  • unicode: кодирует в формате UTF-16 с помощью байтового порядка байтов.
  • utf7: кодирует в формате UTF-7.
  • utf8: кодирует в формате UTF-8 (без BOM).
  • utf8BOM: кодирует в формате UTF-8 с меткой порядка байтов (BOM)
  • utf8NoBOM: кодирует в формате UTF-8 без метки порядка байтов (BOM)
  • utf32: кодирует в формате UTF-32 с помощью байтового порядка байтов.

PowerShell по умолчанию используется utf8NoBOM для всех выходных данных.

Начиная с PowerShell 6.2, параметр кодирования также позволяет числовым идентификаторам зарегистрированных кодовых страниц (например) или строковым именам зарегистрированных кодовых страниц (например-Encoding "windows-1251"-Encoding 1251). Дополнительные сведения см. в документации по .NET для Encoding.CodePage.

Изменение кодировки по умолчанию

PowerShell имеет две переменные по умолчанию, которые можно использовать для изменения поведения кодирования по умолчанию.

  • $PSDefaultParameterValues
  • $OutputEncoding

Дополнительные сведения см. в about_Preference_Variables.

Начиная с PowerShell 5.1 операторы перенаправления (> и >>) вызывают Out-File командлет. Поэтому можно задать кодировку по умолчанию с помощью переменной $PSDefaultParameterValues предпочтения, как показано в этом примере:

$PSDefaultParameterValues['Out-File:Encoding'] = 'utf8'

Используйте следующую инструкцию, чтобы изменить кодировку по умолчанию для всех командлетов, имеющих параметр кодирования .

$PSDefaultParameterValues['*:Encoding'] = 'utf8'

Внимание

Поместив эту команду в профиль PowerShell, рекомендуется использовать глобальный параметр сеанса, который влияет на все команды и скрипты, которые явно не указывают кодировку.

Аналогичным образом следует включить такие команды в скрипты или модули, которые вы хотите вести так же. Используя эти команды, командлеты работают так же, как и при выполнении другим пользователем, на другом компьютере или в другой версии PowerShell.

Автоматическая переменная $OutputEncoding влияет на кодировку PowerShell, используемой для взаимодействия с внешними программами. Он не влияет на кодировку, которую используют операторы перенаправления выходных данных и командлеты PowerShell для сохранения в файлах.

См. также