Примечание.
Для доступа к этой странице требуется авторизация. Вы можете попробовать войти или изменить каталоги.
Для доступа к этой странице требуется авторизация. Вы можете попробовать изменить каталоги.
Краткое описание
Описывает, как 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 любая кодировка Unicode, за исключением UTF7, всегда создает BOM. По умолчанию PowerShell (версия 6 и выше) использует utf8NoBOM для всех выходных текстовых данных.
Для обеспечения оптимальной общей совместимости не используйте 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, такие как cat, sed, awk, и некоторые редакторы, такие как gedit, не знают, как обрабатывать 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и оператор перенаправления>>не пытаются сопоставить кодировку содержимого существующего целевого файла. Вместо этого они используют кодировку по умолчанию, если не используется параметр кодировки. При добавлении содержимого необходимо использовать исходную кодировку файлов. В отсутствие явного параметра кодировки
Add-Contentобнаруживает существующую кодировку и автоматически применяет его к новому содержимому. Если в существующем содержимом отсутствует BOM, используется кодировка ANSI с параметромDefault. ПоведениеAdd-Contentодинаково в PowerShell (версии 6 и выше), кроме кодировки по умолчаниюUtf8.Export-Csv -Appendсоответствует существующей кодировке, если целевой файл содержит BOM. При отсутствии BOM используется кодировкаUtf8.Start-Transcript -Appendсоответствует существующей кодировке файлов, включающих BOM. В отсутствие BOM по умолчанию используется кодировкаAscii. Эта кодировка может привести к потере данных или повреждению символов, если данные в расшифровке содержат многобайтовые символы.
Для командлетов, которые считывают строковые данные при отсутствии BOM:
Get-ContentиImport-PowerShellDataFileиспользует кодировку ANSIDefault. 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 в порядке Big-endian. -
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, параметр кодировки
Начиная с 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