О кодировке символов
Краткое описание
Описывает, как 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, такие как , awk
sed
и некоторые редакторы, такие как cat
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,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-разрядная версия).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, параметр кодирования также позволяет числовым идентификаторам зарегистрированных кодовых страниц (например) или строковым именам зарегистрированных кодовых страниц (например-Encoding "windows-1251"
-Encoding 1251
). Дополнительные сведения см. в документации по .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