다음을 통해 공유


about_Character_Encoding

간단한 설명

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

자세한 설명

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

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

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

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

  • Microsoft.PowerShell.Management
    • 콘텐츠 추가
    • Get-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와 유사한 플랫폼에서 문제가 될 수 있습니다. 많은 Unix 도구(예: cat, awksed및 일부 편집기)gedit는 BOM을 처리하는 방법을 모릅니다.

Windows PowerShell의 문자 인코딩

PowerShell 5.1 에서 인코딩 매개 변수는 다음 값을 지원합니다.

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

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

참고 항목

유니코드 인코딩을 사용하는 경우를 제외하고 UTF7항상 BOM을 만듭니다.

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

  • Out-File 및 리디렉션 연산 > 자를 만들고 >> UTF-16LE을 만듭니다. 이는 특히 차이점 Set-Content 이 있습니다 Add-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 리디렉션 연산자는 >> 기존 대상 파일의 콘텐츠 인코딩과 일치시키려고 시도하지 않습니다. 대신 인코딩 매개 변수를 사용하지 않는 한 기본 인코딩을 사용합니다. 콘텐츠를 추가할 때 파일 원래 인코딩을 사용해야 합니다.

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

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

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

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

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

  • Import-Csv, Import-CliXmlBOM Select-String 이 없는 경우 가정 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: little-endian 바이트 순서를 사용하여 UTF-16 형식으로 인코딩합니다.
  • utf7: UTF-7 형식으로 인코딩합니다.
  • utf8: UTF-8 형식(BOM 없음)으로 인코딩합니다.
  • utf8BOM: BOM(바이트 순서 표시)을 사용하여 UTF-8 형식으로 인코딩
  • utf8NoBOM: BOM(바이트 순서 표시)이 없는 UTF-8 형식으로 인코딩
  • utf32: little-endian 바이트 순서를 사용하여 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부터 리디렉션 연산자(>>>)는 cmdlet을 Out-File 호출합니다. 따라서 이 예제와 같이 기본 설정 변수를 사용하여 $PSDefaultParameterValues 기본 인코딩을 설정할 수 있습니다.

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

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

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

Important

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

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

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

참고 항목