Примечание.
Для доступа к этой странице требуется авторизация. Вы можете попробовать войти или изменить каталоги.
Для доступа к этой странице требуется авторизация. Вы можете попробовать изменить каталоги.
Краткое описание
Описывает, как 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, такие как , catsedи некоторые редакторы, такие как awkgedit не знают, как лечить 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используетAsciiкодировку по умолчанию.Start-TranscriptсоздаетUtf8файлы с помощью BOM. Если используется параметр "Добавить", кодировка может отличаться (см. ниже).
Для команд, которые добавляются к существующему файлу:
Out-File -Append>>и оператор перенаправления не пытается сопоставить кодировку содержимого существующего целевого файла. Вместо этого они используют кодировку по умолчанию, если параметр кодирования не используется. При добавлении содержимого необходимо использовать исходную кодировку файлов.При отсутствии явного обнаруживает существующую кодировку и автоматически применяет его к новому содержимому. Если существующее содержимое не имеет 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использует кодировкуDefaultANSI. ANSI также является тем, что использует модуль PowerShell при чтении исходного кода из файлов.Import-Csv,Import-ClixmlиSelect-StringпредположимUtf8, что в отсутствие BOM.
Кодировка символов в PowerShell
В PowerShell (версии 7.1 и более поздних версиях) параметр кодирования поддерживает следующие значения:
-
ascii: использует кодировку для набора символов ASCII (7-разрядная версия). -
ansi: использует кодировку для кодовой страницы ANSI текущего языка и региональных параметров. Этот параметр добавлен в PowerShell 7.4. -
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, параметр кодирования Дополнительные сведения см. в документации по .NET для Encoding.CodePage.
Начиная с PowerShell 7.4, можно использовать ANSI значение параметра кодировки для передачи числового идентификатора для кодовой страницы ANSI текущего языка и региональных параметров без необходимости указывать его вручную.
Изменение кодировки по умолчанию
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 для сохранения в файлах.
См. также
PowerShell