次の方法で共有


about_Character_Encoding

簡単な説明

PowerShell で文字列データの入力と出力に文字エンコードを使用する方法について説明します。

長い説明

Unicode は、世界的な文字エンコード標準です。 システムでは、文字と文字列の操作にのみ Unicode が使用されます。 Unicode のすべての側面の詳細については、「Unicode 標準」を参照してください。

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では、 を除く UTF7Unicode エンコードでは常に BOM が作成されます。 PowerShell (v6 以降) では、すべてのテキスト出力の既定値が に utf8NoBOM 設定されます。

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

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

Unix に似たプラットフォームで PowerShell スクリプトを作成するか、Visual Studio Code などの Windows 上でクロスプラットフォーム エディターを使用すると、 を使用して UTF8NoBOMファイルがエンコードされます。 これらのファイルは PowerShell では正常に動作しますが、ファイルに Ascii 以外の文字が含まれている場合は、Windows PowerShellで中断する可能性があります。

スクリプトで Ascii 以外の文字を使用する必要がある場合は、BOM で UTF-8 として保存します。 BOM がない場合、Windows PowerShellは、スクリプトが従来の "ANSI" コード ページでエンコードされていると誤って解釈されます。 逆に、UTF-8 BOM を持つファイルは、Unix のようなプラットフォームで問題になる可能性があります。 、 sedawkなどのcat多くの Unix ツール、および などのgedit一部のエディターでは、BOM の処理方法がわかりません。

Windows PowerShellでの文字エンコード

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

  • Ascii Ascii (7 ビット) 文字セットを使用します。
  • BigEndianUnicode ビッグ エンディアンバイト順で UTF-16 を使用します。
  • BigEndianUTF32 ビッグ エンディアンバイト順で UTF-32 を使用します。
  • Byte 一連の文字をバイトシーケンスにエンコードします。
  • Default システムのアクティブなコード ページ (通常は ANSI) に対応するエンコードを使用します。
  • Oem システムの現在の OEM コード ページに対応するエンコードを使用します。
  • StringUnicode と同じです。
  • Unicode リトル エンディアンバイト順で UTF-16 を使用します。
  • UnknownUnicode と同じです。
  • UTF32 リトル エンディアン バイト順で UTF-32 を使用します。
  • UTF7 UTF-7 を使用します。
  • UTF8 UTF-8 (BOM を使用) を使用します。

一般に、Windows PowerShellでは既定で Unicode UTF-16LE エンコードが使用されます。 ただし、Windows PowerShell のコマンドレットで使用される既定のエンコードは一貫性がありません。

注意

を除く UTF7任意の Unicode エンコードを使用すると、常に BOM が作成されます。

ファイルに出力を書き込むコマンドレットの場合:

  • Out-Fileと リダイレクト演算子を使用>して >> UTF-16LE を作成します。これは、 と Add-Contentとは特に異なりますSet-Content

  • New-ModuleManifest UTF-16LE Export-CliXml ファイルも作成します。

  • ターゲット ファイルが空または存在しない場合は、 Set-ContentAdd-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-ContentImport-PowerShellDataFile では、ANSI エンコードが使用されます Default 。 ANSI は、ファイルからソース コードを読み取るときに PowerShell エンジンが使用する機能でもあります。

  • Import-CsvImport-CliXml、および Select-String は、BOM がない場合に想定 Utf8 します。

PowerShell での文字エンコード

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

  • ascii: ASCII (7 ビット) 文字セットのエンコードを使用します。
  • 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") も許可されます。 詳細については、 Encoding.CodePage の .NET ドキュメントを参照してください。

既定のエンコードの変更

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 コマンドレットがファイルへの保存に使用するエンコードには影響しません。

こちらもご覧ください