기본적으로 명령의 출력을 파일로 리디렉션하거나 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을 어떻게 설정합니까?
답변
참고 : 다음은 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-File
및Set-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
,sed
와awk
-와 같은 심지어 일부 편집자gedit
-하기 를 통해 의사 BOM을 통과 즉, 데이터 로 취급합니다 .- 이것이 항상 문제가되는 것은 아니지만, 예를 들어
bash
with, saytext=$(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 -Append
UTF-8을 Add-Content
가정하고 ANSI를 가정합니다.
Start-Transcript -Append
기존 인코딩과 부분적으로 일치 : BOM 과 인코딩 을 올바르게 일치 하지만 ASCII 인코딩이없는 경우 잠재적으로 손실 될 수있는 ASCII 인코딩으로 기본 설정됩니다.
읽는 cmdlet (즉, BOM 이 없을 때 사용되는 인코딩 ) :
Get-Content
및 Import-PowerShellDataFile
ANSI (기본값 Default
과 일치) Set-Content
.
ANSI는 또한 파일에서 소스 코드 를 읽을 때 PowerShell 엔진 자체가 기본값으로 사용하는 것 입니다.
대조적으로 Import-Csv
, Import-CliXml
및 Select-String
UTF-8 BOM의 부재를 가정한다.
답변
간단히 말해서 다음을 사용하십시오.
write-output "your text" | out-file -append -encoding utf8 "filename"