다음을 통해 공유


문자 인코딩에 대한

간단한 설명

PowerShell에서 문자열 데이터의 입력 및 출력에 문자 인코딩을 사용하는 방법을 설명합니다.

긴 설명

유니코드는 전 세계 문자 인코딩 표준입니다. 시스템은 문자 및 문자열 조작에 유니코드만 사용합니다. 유니코드의 모든 측면에 대한 자세한 설명은 유니코드 표준참조하세요.

Windows는 유니코드 및 기존 문자 집합을 지원합니다. Windows 코드 페이지와 같은 기존 문자 집합은 8비트 값 또는 8비트 값의 조합을 사용하여 특정 언어 또는 지리적 지역 설정에서 사용되는 문자를 나타냅니다.

PowerShell은 기본적으로 유니코드 문자 집합을 사용합니다. 그러나 여러 cmdlet에는 다른 문자 집합에 대한 인코딩을 지정할 수 있는 인코딩 매개 변수가 있습니다. 이 매개 변수를 사용하면 다른 시스템 및 애플리케이션과의 상호 운용성에 필요한 특정 문자 인코딩을 선택할 수 있습니다.

다음 cmdlet에는 인코딩 매개 변수가 있습니다.

  • 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을 만듭니다. PowerShell(v6 이상)은 기본적으로 모든 텍스트 출력을 utf8NoBOM으로 설정합니다.

최상의 전반적인 호환성을 위해 UTF-8 파일에서 BOM을 사용하지 마세요. Windows 플랫폼에서도 사용되는 Unix 플랫폼 및 Unix-heritage 유틸리티는 BOM을 지원하지 않습니다.

마찬가지로 UTF7 인코딩은 피해야 합니다. UTF-7은 표준 유니코드 인코딩이 아니며 모든 버전의 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에서 인코딩 매개 변수는 다음 값을 지원합니다.

  • Ascii Ascii(7비트) 문자 집합을 사용합니다.
  • BigEndianUnicode는 빅 엔디안 바이트 순서로 UTF-16을 사용합니다.
  • BigEndianUTF32는 big-endian 바이트 순서를 사용하는 UTF-32입니다.
  • Byte 문자 집합을 바이트 시퀀스로 인코딩합니다.
  • Default 시스템의 활성 코드 페이지(일반적으로 ANSI)에 해당하는 인코딩을 사용합니다.
  • Oem 시스템의 현재 OEM 코드 페이지에 해당하는 인코딩을 사용합니다.
  • String Unicode동일합니다.
  • Unicode UTF-16을 사용하며, 바이트 순서는 little-endian입니다.
  • Unknown Unicode동일합니다.
  • UTF32 UTF-32를 사용하며, 바이트 순서는 little-endian입니다.
  • UTF7 UTF-7을 사용합니다.
  • UTF8 UTF-8(BOM 포함)을 사용합니다.

일반적으로 Windows PowerShell은 기본적으로 유니코드 UTF-16LE 인코딩을 사용합니다. 그러나 Windows PowerShell의 cmdlet에서 사용하는 기본 인코딩은 일치하지 않습니다.

메모

UTF7제외한 모든 유니코드 인코딩을 사용하면 항상 BOM을 만듭니다.

파일에 출력을 쓰는 cmdlet의 경우:

  • Out-File 및 리디렉션 연산자 >>>는 UTF-16LE을 생성하며, 이는 Set-ContentAdd-Content와 현저하게 다릅니다.

  • New-ModuleManifestExport-Clixml UTF-16LE 파일도 만듭니다.

  • 대상 파일이 비어 있거나 존재하지 않는 경우 Set-ContentAdd-ContentDefault 인코딩을 사용합니다. 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 파일을 만듭니다. 추가 매개 변수를 사용하면 인코딩이 다를 수 있습니다(아래 참조).

기존 파일에 추가하는 명령의 경우:

  • Out-File -Append>> 리디렉션 연산자는 기존 대상 파일의 콘텐츠 인코딩과 일치시키려고 시도하지 않습니다. 대신 인코딩 매개 변수를 사용하지 않는 한 기본 인코딩을 사용합니다. 콘텐츠를 추가할 때 파일 원래 인코딩을 사용해야 합니다.

  • 명시적 인코딩 매개 변수가 없는 경우 Add-Content 기존 인코딩을 검색하여 새 콘텐츠에 자동으로 적용합니다. 기존 콘텐츠에 BOM이 없는 경우 Default ANSI 인코딩이 사용됩니다. 기본 인코딩이 Add-Content경우를 제외하고 Utf8 동작은 PowerShell(v6 이상)에서 동일합니다.

  • Export-Csv -Append 대상 파일에 BOM이 포함된 경우 기존 인코딩과 일치합니다. BOM이 없는 경우 Utf8 인코딩을 사용합니다.

  • Start-Transcript -Append BOM을 포함하는 파일의 기존 인코딩과 일치합니다. BOM이 없으면 기본 설정으로 Ascii 인코딩이 됩니다. 이 인코딩은 기록의 데이터에 멀티바이트 문자가 포함된 경우 데이터 손실 또는 문자 손상이 발생할 수 있습니다.

BOM이 없는 경우 문자열 데이터를 읽는 cmdlet의 경우:

  • Get-ContentImport-PowerShellDataFileDefault ANSI 인코딩을 사용합니다. ANSI는 파일에서 소스 코드를 읽을 때 PowerShell 엔진이 사용하는 기능이기도 합니다.

  • Import-Csv, Import-ClixmlSelect-String BOM이 없는 경우 Utf8 가정합니다.

PowerShell의 문자 인코딩

PowerShell(v7.1 이상)에서 인코딩 매개 변수는 다음 값을 지원합니다.

  • ascii: ASCII(7비트) 문자 집합에 대한 인코딩을 사용합니다.
  • ansi: 현재 문화권의 ANSI 코드 페이지에 대한 인코딩을 사용합니다. 이 옵션은 PowerShell 7.4에 추가되었습니다.
  • bigendianunicode: big-endian 바이트 순서를 사용하여 UTF-16 형식으로 인코딩합니다.
  • bigendianutf32: big-endian 바이트 순서를 사용하여 UTF-32 형식으로 인코딩합니다.
  • oem: MS-DOS 및 콘솔 프로그램에 기본 인코딩을 사용합니다.
  • unicode: UTF-16 형식으로 인코딩하며, little-endian 바이트 순서를 사용합니다.
  • utf7: UTF-7 형식으로 인코딩합니다.
  • utf8: UTF-8 형식(BOM 없음)으로 인코딩합니다.
  • utf8BOM: BOM(바이트 순서 표시)을 사용하여 UTF-8 형식으로 인코딩
  • utf8NoBOM: BOM(바이트 순서 표시)이 없는 UTF-8 형식으로 인코딩
  • utf32: UTF-32 형식으로 인코딩하며, 리틀 엔디언 바이트 오더를 사용합니다.

PowerShell은 모든 출력에 대해 기본값으로 utf8NoBOM을 사용합니다.

PowerShell 6.2부터 인코딩 매개 변수는 등록된 코드 페이지(예: -Encoding 1251) 또는 등록된 코드 페이지의 문자열 이름(예: -Encoding "windows-1251")의 숫자 ID를 허용합니다. 자세한 내용은 Encoding.CodePage.NET 설명서를 참조하세요.

PowerShell 7.4부터 ANSI 매개 변수의 값을 사용하여 현재 문화권의 ANSI 코드 페이지에 대한 숫자 ID를 수동으로 지정할 필요 없이 전달할 수 있습니다.

기본 인코딩 변경

PowerShell에는 기본 인코딩 동작을 변경하는 데 사용할 수 있는 두 가지 기본 변수가 있습니다.

  • $PSDefaultParameterValues
  • $OutputEncoding

자세한 내용은 about_Preference_Variables참조하세요.

PowerShell 5.1부터 리디렉션 연산자(>>>)는 Out-File cmdlet을 호출합니다. 따라서 이 예제와 같이 $PSDefaultParameterValues 기본 설정 변수를 사용하여 기본 인코딩을 설정할 수 있습니다.

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

다음 문을 사용하여 인코딩 매개 변수가 있는 모든 cmdlet의 기본 인코딩을 변경합니다.

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

중요하다

이 명령을 PowerShell 프로필에 배치하면 인코딩을 명시적으로 지정하지 않는 모든 명령 및 스크립트에 영향을 주는 세션 전역 설정이 기본 설정이 됩니다.

마찬가지로 동일한 방식으로 동작하려는 스크립트 또는 모듈에 이러한 명령을 포함해야 합니다. 이러한 명령을 사용하면 다른 사용자, 다른 컴퓨터 또는 다른 버전의 PowerShell에서 실행하는 경우에도 cmdlet이 동일한 방식으로 동작합니다.

자동 변수 $OutputEncoding PowerShell이 외부 프로그램과 통신하는 데 사용하는 인코딩에 영향을 줍니다. 출력 리디렉션 연산자와 PowerShell cmdlet이 파일에 저장하는 데 사용하는 인코딩에는 영향을 주지 않습니다.

참고하십시오