PowerShell의 기본 출력 인코딩을 UTF-8로 변경


105

기본적으로 명령의 출력을 파일로 리디렉션하거나 PowerShell의 다른 항목으로 파이프 할 때 인코딩은 UTF-16이므로 유용하지 않습니다. UTF-8로 변경하려고합니다.

>foo.txt구문을 로 대체하여 사례별로 수행 할 수 | out-file foo.txt -encoding utf8있지만 매번 반복해야하는 것은 어색합니다.

PowerShell에서 항목을 설정하는 지속적인 방법은 항목을 넣는 것입니다 \Users\me\Documents\WindowsPowerShell\profile.ps1. 이 파일이 실제로 시작시 실행되는지 확인했습니다.

출력 인코딩을 설정할 수 있다고 말 $PSDefaultParameterValues = @{'Out-File:Encoding' = 'utf8'}했지만 이것을 시도했지만 효과가 없었습니다.

https://blogs.msdn.microsoft.com/powershell/2006/12/11/outputencoding-to-the-rescue/ 대해 이야기하는 $OutputEncoding것이 중요한되어야 것처럼 언뜻 보이지만, 그것은 출력되는 부호화 대해 이야기 실제로 일어나는 일이 아닙니다.

UTF-8을 사용하도록 PowerShell을 어떻게 설정합니까?

답변:


162

참고 : 다음은 Windows PowerShell에 적용됩니다 . 플랫폼 간 PowerShell Core (v6 +) 버전에 대한 다음 섹션
참조하세요 .

  • PSv5.1 이상 , >그리고 >>효과적으로 별명 Out-File을 수행 할 수 있습니다, 기본 인코딩을 설정하기위한 >/ >>/ Out-File비아 $PSDefaultParameterValues기본 설정 변수 :

    • $PSDefaultParameterValues['Out-File:Encoding'] = 'utf8'
  • PSv5.0 이하 , 당신이 에 대한 인코딩을 변경 >/>> 만에 PSv3 이상 , 위의 기술은 수행 에 대한 명시 적 호출에 대한 작업을Out-File .
    ( $PSDefaultParameterValues기본 설정 변수는 PSv3.0에서 도입되었습니다).

  • PSv3.0 이상 , 당신이 원하는 경우 에 대한 암호화 기본 설정 모두 지원하는 cmdlet 매개 변수
    -Encoding
    (PSv5.1 +에 포함 >하고 >>), 사용 :

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

당신은 당신이 명령을 배치하면$PROFILE 같은 cmdlet이 같은 Out-FileSet-Content 이 그것을 만드는 UTF-8 기본적으로 인코딩하지만 노트를 사용하는 세션 전역 설정 명시 적으로 인코딩을 지정하지 않은 모든 명령 / 스크립트에 영향을 미칠 것입니다.

마찬가지로, 동일한 방식으로 작동하려는 스크립트 나 모듈에 이러한 명령을 포함해야합니다 . 그래야 다른 사용자 나 다른 컴퓨터에서 실행할 때도 실제로 동일하게 작동합니다.

주의 사항 : ** PowerShell, v5.1 부터는 Windows 세계 에서만 일반적으로 사용되는 (의사) BOM _ **을 사용 하여 UTF-8 파일을 항상 생성합니다. Unix 기반 유틸리티는이 BOM을 인식하지 못합니다 (아래 참조). BOM이없는 UTF-8 파일을 생성하는 해결 방법 은 이 게시물 을 참조하십시오 .

여러 Windows PowerShell 표준 cmdlet 에서 일관되지 않은 기본 문자 인코딩 동작에 대한 요약은 하단 섹션을 참조하십시오.


자동 $OutputEncoding변수는 관련없으며 PowerShell이 외부 프로그램 과 통신하는 방식 (PowerShell이 문자열을 보낼 때 사용하는 인코딩) 에만 적용되며 출력 리디렉션 연산자 및 PowerShell cmdlet이 파일에 저장하는 데 사용하는 인코딩과는 관련이 없습니다.


선택적 읽기 : 플랫폼 간 관점 : PowerShell Core :

PowerShell은 이제 PowerShell Core 에디션을 통해 플랫폼 간 이며, 그 인코딩 은 유닉스 계열 플랫폼에 따라 기본적으로 BOM이없는 UTF-8로 설정 됩니다.

  • 즉, BOM이없는 소스 코드 파일은 UTF-8로 간주되며 >/ Out-File/ 사용은 Set-Content기본값이 BOM없는 UTF-8로 설정됩니다. utf8 -Encoding인수를 명시 적으로 사용 하면 BOM이없는 UTF-8이 생성되지만 값 있는 의사 BOM 을 사용하여 파일을 생성하도록 선택할 수 있습니다 utf8bom.

  • 당신은 유닉스와 같은 요즘도에 플랫폼 A의 에디터로 PowerShell 스크립트를 작성하는 경우 윈도우 와 같은 비주얼 스튜디오 코드와 숭고한 텍스트와 같은 크로스 플랫폼 편집자, 결과 *.ps1파일은 일반적으로 할 수 없습니다 수정 UTF-8 의사 BOM을 가지고 :

    • 이것은 PowerShell Core에서 잘 작동합니다 .
    • 파일에 ASCII가 아닌 문자가 포함 된 경우 Windows PowerShell 에서 중단 될 수 있습니다 . 스크립트에서 비 ASCII 문자를 사용해야하는 경우 BOM과 함께 UTF-8로 저장하십시오 .
      BOM이 없으면 Windows PowerShell (mis)은 스크립트가 레거시 "ANSI"코드 페이지 (예 : 미국 영어 시스템의 Windows-1252와 같은 사전 유니 코드 응용 프로그램의 시스템 로캘에 의해 결정됨)에서 인코딩 된 것으로 해석합니다.
  • 반대로, 파일 음주 가 UTF-8 의사 BOM이에 문제가 될 수있는 유닉스 플랫폼으로 그들은 같은 유닉스 유틸리티 원인 cat, sedawk-와 같은 심지어 일부 편집자 gedit-하기 를 통해 의사 BOM을 통과 즉, 데이터 로 취급합니다 .

    • 이것이 항상 문제가되는 것은 아니지만, 예를 들어 bashwith, say text=$(cat file)또는 text=$(<file)- 에서 파일을 문자열로 읽으려고 할 때 결과 변수는 처음 3 바이트로 의사 BOM을 포함합니다.

Windows PowerShell의 일관되지 않은 기본 인코딩 동작 :

안타깝게도 Windows PowerShell에서 사용되는 기본 문자 인코딩은 매우 일관성이 없습니다. 이전 섹션에서 설명한대로 크로스 플랫폼 PowerShell Core 에디션은이를 훌륭하게 마무리했습니다.

노트 :

  • 다음은 모든 표준 cmdlet 을 포함하지 않습니다 .

  • 도움말 항목을 찾기위한 검색 cmdlet 이름은 이제 기본적으로 항목 의 PowerShell Core 버전을 표시합니다. 왼쪽의 항목 목록 위에있는 버전 드롭 다운 목록을 사용하여 Windows PowerShell 버전 으로 전환합니다 .

  • 이 글을 쓰는 시점에서 문서는 ASCII가 Windows PowerShell의 기본 인코딩이라고 잘못 주장하는 경우가 많습니다 . 이 GitHub 문서 문제를 참조 하세요 .


다음을 작성하는 cmdlet :

Out-File그리고 >/ >>"유니 코드"생성 -UTF-16LE- 기본적으로 파일-모든 ASCII 범위 문자 (너무)는 2 바이트 로 표시됩니다. 이는 Set-Content/ 와 크게 다릅니다 Add-Content(다음 요점 참조). New-ModuleManifest그리고 Export-CliXml또한 UTF-16LE 파일을 만들 수 있습니다.

Set-Content(그리고 Add-Content파일이 아직 존재하지 않거나 비어있는 경우) ANSI 인코딩 (PowerShell이 ​​호출하는 활성 시스템 로케일의 ANSI 레거시 코드 페이지에서 지정한 인코딩)을 사용합니다 Default.

Export-Csv실제로 문서화 된대로 ASCII 파일을 생성하지만 아래의 참고 사항을 참조하십시오 -Append.

Export-PSSession 기본적으로 BOM이있는 UTF-8 파일을 생성합니다.

New-Item -Type File -Value 현재 BOM이없는 (!) UTF-8을 생성합니다.

Send-MailMessage도움말 항목은 또한 ASCII 인코딩을 기본 주장 - 나는 개인적으로 주장 것을 확인하지 않았습니다.

Start-Transcript 항상 BOM을 사용 하여 UTF-8 파일 생성 하지만 아래의 참고 사항을 참조하십시오 -Append.

기존 파일에 추가 하는 Re 명령 :

>>/ Out-File -Append하지 않습니다 파일의 인코딩과 일치하도록 시도 기존의 컨텐츠를 . 즉, -Encoding옵션이 >>아닌를 사용하여 달리 지시하지 않는 한 맹목적으로 기본 인코딩을 적용합니다 ( $PSDefaultParameterValues위에 표시된대로 를 통해 PSv5.1 +에서 간접적으로 제외 ). 간단히 말해서, 기존 파일 콘텐츠의 인코딩을 알고 동일한 인코딩을 사용하여 추가해야합니다.

Add-Content칭찬 할만한 예외입니다. 명시 적 -Encoding인수가 없는 경우 기존 인코딩을 감지하여 새 콘텐츠에 자동으로 적용합니다.감사합니다, js2010 . Windows PowerShell에서 이는 기존 콘텐츠에 BOM이없는 경우 적용되는 것이 ANSI 인코딩 인 반면 PowerShell Core에서는 UTF-8임을 의미합니다.

PowerShell Core 에도 영향을 미치는 Out-File -Append/ >>와 간의이 불일치 는 이 GitHub 문제 에서 설명합니다.Add-Content 합니다.

Export-Csv -Append 부분적으로 기존 인코딩과 일치 : 기존 파일의 인코딩이 ASCII / UTF-8 / ANSI 중 하나 인 경우 무조건 UTF-8을 추가 하지만 UTF-16LE 및 UTF-16BE와 올바르게 일치합니다.
다르게 말하면 : BOM이없는 경우 Export-Csv -AppendUTF-8을 Add-Content가정하고 ANSI를 가정합니다.

Start-Transcript -Append 기존 인코딩과 부분적으로 일치 : BOM 과 인코딩 올바르게 일치 하지만 ASCII 인코딩이없는 경우 잠재적으로 손실 될 수있는 ASCII 인코딩으로 기본 설정됩니다.


읽는 cmdlet (즉, BOM없을 때 사용되는 인코딩 ) :

Get-ContentImport-PowerShellDataFileANSI (기본값 Default과 일치) Set-Content.
ANSI는 또한 파일에서 소스 코드 를 읽을 때 PowerShell 엔진 자체가 기본값으로 사용하는 것 입니다.

대조적으로 Import-Csv, Import-CliXmlSelect-StringUTF-8 BOM의 부재를 가정한다.


당신은 어떻게 설명 할 수 >/이 >>효과적인 별명이되었다 Out-File5.1?
Maximilian Burszley

@ TheIncorrigible1 : 나에게 그것을 지적한 것은 PetSerAl일지도 모르지만, 나는 어디서 어떻게 어떻게 기억이 나지 않는다. Windows PowerShell은 비공개 소스이지만 동일한 유사 별칭 관계가 PowerShell Core에도 적용되므로 후자의 소스 코드에서 찾을 수 있습니다.
mklement0

2
@EliaWeiss는 동의하지 않습니다.하지만 구체적으로는 Windows PowerShell이며, 결국 PowerShell Core 에서 제대로 작동했습니다 .
mklement0

2
@Marc : VS Code 및 기타 최신 크로스 플랫폼 편집기는 기본적으로 UTF-8을 사용하지만 ANSI 인코딩 파일을 잘못 해석하게됩니다. 메모장은 휴리스틱 을 사용 하여 인코딩 을 추측 합니다. 요점은 UTF-8 인코딩 파일이 기술적으로 유효한 ANSI 인코딩 파일이기 때문에 추측 일 뿐이라는 것입니다 (반대의 경우는 아님). Windows의 모든 것이 Unix와 유사한 플랫폼과 같이 BOM이없는 상태에서 기본적으로 UTF-8로 설정되어 있으면 좋을 것입니다.
mklement0

2
현재 값을 보려면 다음을 입력하십시오.$PSDefaultParameterValues
Sandburg

3

간단히 말해서 다음을 사용하십시오.

write-output "your text" | out-file -append -encoding utf8 "filename"
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.