Поделиться через


о_Кодировке_Символов

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

Описывает, как 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 использует кодировку ANSI Default. 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, параметр кодировки также поддерживает указание числовых идентификаторов зарегистрированных кодовых страниц (например, ) или строковых имен зарегистрированных кодовых страниц (например, ). Дополнительные сведения см. в документации .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 для сохранения в файлах.

См. также