ja-JP/about_Character_Encoding.help.txt

TOPIC
    about_Character_Encoding

簡単な説明
    PowerShell が文字列データの入出力に文字エンコードをどのように使用する
    かを説明します。

詳細な説明
    Unicode は世界規模の文字エンコード標準です。システムは文字と文字列の
    操作に Unicode のみを使用します。Unicode のすべての側面に関する詳しい
    説明については、The Unicode Standard を参照してください。

    Windows は Unicode と従来の文字セットをサポートします。Windows コード
    ページなどの従来の文字セットは、8 ビット値または 8 ビット値の組み合わせを
    使用して、特定の言語または地域設定で使用される文字を表します。

    PowerShell は既定で Unicode 文字セットを使用します。ただし、いくつかの
    コマンドレットには Encoding パラメーターがあり、異なる文字セットの
    エンコードを指定できます。このパラメーターを使用すると、他のシステムや
    アプリケーションとの相互運用に必要な特定の文字エンコードを選択できます。

    次のコマンドレットには Encoding パラメーターがあります。

    - 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)は、ファイルまたはテキストストリームの先頭の
    数バイトにある Unicode の署名で、データに使用されている Unicode エンコード
    を示します。詳細については、バイトオーダーマークのドキュメントを参照して
    ください。

    Windows PowerShell では、UTF7 を除くすべての Unicode エンコードで常に
    BOM が作成されます。PowerShell(v6 以降)は、すべてのテキスト出力で既定で
    utf8NoBOM を使用します。

    全体的な互換性を最大にするには、UTF-8 ファイルで BOM を使用しないように
    してください。Unix プラットフォームや、Windows プラットフォームでも使用
    される Unix 由来のユーティリティは、BOM をサポートしません。

    同様に、UTF7 エンコードも避けるべきです。UTF-7 は標準の Unicode エンコード
    ではなく、すべてのバージョンの PowerShell で BOM なしで書き込まれます。

    Unix 系のプラットフォームで PowerShell スクリプトを作成する場合、または
    Windows 上で Visual Studio Code などのクロスプラットフォームエディターを
    使用する場合、ファイルは UTF8NoBOM でエンコードされます。これらのファイル
    は PowerShell では問題なく動作しますが、非 ASCII 文字を含む場合は Windows
    PowerShell で壊れる可能性があります。

    スクリプトで非 ASCII 文字を使用する必要がある場合は、BOM 付きの UTF-8 で
    保存してください。BOM がないと、Windows PowerShell はスクリプトを従来の
    「ANSI」コードページでエンコードされていると誤って解釈します。逆に、
    UTF-8 BOM が付いたファイルは Unix 系のプラットフォームで問題を起こす場合が
    あります。cat、sed、awk などの多くの Unix ツールや、gedit などの一部の
    エディターは、BOM の扱い方を知りません。

    Windows PowerShell での文字エンコード

    PowerShell 5.1 では、Encoding パラメーターは次の値をサポートします。

    - 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 は既定で Unicode の UTF-16LE エンコードを使用
    します。ただし、Windows PowerShell のコマンドレットが使用する既定の
    エンコードには一貫性がありません。

    注: UTF7 を除くすべての Unicode エンコードでは常に 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 ファイルを作成しますが、Append パラメーターを使用
      する場合は異なるエンコードを使用します(後述)。

    - Export-PSSession は既定で BOM 付きの UTF-8 ファイルを作成します。

    - New-Item -Type File -Value は BOM なしの UTF-8 ファイルを作成します。

    - Send-MailMessage は既定で Ascii エンコードを使用します。

    - Start-Transcript は BOM 付きの Utf8 ファイルを作成します。Append
      パラメーターを使用する場合、エンコードは異なる場合があります(後述)。

    既存のファイルに追記するコマンドの場合:

    - Out-File -Append とリダイレクト演算子 >> は、既存の対象ファイルの内容の
      エンコードに合わせようとはしません。代わりに、Encoding パラメーターが
      使用されない限り既定のエンコードを使用します。内容を追記するときは、
      ファイル本来のエンコードを使用する必要があります。

    - 明示的な Encoding パラメーターがない場合、Add-Content は既存のエンコード
      を検出し、新しい内容に自動的に適用します。既存の内容に BOM がない場合は、
      Default の ANSI エンコードが使用されます。Add-Content の動作は
      PowerShell(v6 以降)でも同じですが、既定のエンコードは 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 は、BOM がない場合 Utf8 を
      想定します。

    PowerShell での文字エンコード

    PowerShell(v7.1 以降)では、Encoding パラメーターは次の値をサポート
    します。

    - 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 バイトオーダーマーク(BOM)付きの UTF-8 形式に
                       エンコードします。
    - utf8NoBOM バイトオーダーマーク(BOM)なしの UTF-8 形式に
                       エンコードします。
    - utf32 リトルエンディアンのバイト順で UTF-32 形式にエンコード
                       します。

    PowerShell はすべての出力で既定で utf8NoBOM を使用します。

    PowerShell 6.2 以降、Encoding パラメーターでは、登録されたコードページの
    数値 ID(-Encoding 1251 など)や、登録されたコードページの文字列名
    (-Encoding "windows-1251" など)も使用できます。詳細については、.NET の
    ドキュメント Encoding.CodePage を参照してください。

    PowerShell 7.4 以降では、Encoding パラメーターに ANSI 値を使用すると、
    現在のカルチャの ANSI コードページの数値 ID を手動で指定せずに渡すことが
    できます。

    既定のエンコードの変更

    PowerShell には、既定のエンコードの動作を変更するために使用できる 2 つの
    既定の変数があります。

    - $PSDefaultParameterValues
    - $OutputEncoding

    詳細については、about_Preference_Variables を参照してください。

    PowerShell 5.1 以降、リダイレクト演算子(> および >>)は Out-File
    コマンドレットを呼び出します。そのため、次の例のように
    $PSDefaultParameterValues 設定変数を使用して、これらの既定のエンコードを
    設定できます。

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

    Encoding パラメーターを持つすべてのコマンドレットの既定のエンコードを
    変更するには、次の文を使用します。

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

    重要: このコマンドを PowerShell プロファイルに記述すると、この設定は
    セッション全体のグローバル設定になり、エンコードを明示的に指定しない
    すべてのコマンドとスクリプトに影響します。

    同様に、同じように動作させたいスクリプトやモジュールには、このような
    コマンドを含めるべきです。これらのコマンドを使用すると、別のユーザーが
    実行した場合、別のコンピューターで実行した場合、または別のバージョンの
    PowerShell で実行した場合でも、コマンドレットが同じように動作することが
    保証されます。

    自動変数 $OutputEncoding は、PowerShell が外部プログラムと通信するときに
    使用するエンコードに影響します。出力リダイレクト演算子や PowerShell
    コマンドレットがファイルに保存するときに使用するエンコードには影響しません。

関連項目
    about_Preference_Variables
    Byte order mark
    Code Pages - Win32 apps
    Encoding.CodePage
    Introduction to character encoding in .NET
    The Unicode Standard
    UTF-16LE

----
原文: PowerShell-Docs (CC BY 4.0) の翻訳 / PSHelpJaJP