명령 프롬프트 / Windows Powershell(Windows 10)에서 UTF-8 인코딩(CHCP 65001) 사용
저는 강제로 사용해 왔습니다.chcp 65001
명령 프롬프트와 Windows Powershell에서 잠시 동안이지만 SO와 다른 여러 커뮤니티의 Q&A 게시물을 보면 위험하고 비효율적인 해결책인 것 같습니다.Microsoft가 제공하는 개선된/완전한 대안은 무엇입니까?chcp 65001
수동으로 레지스트리를 변경하지 않고 영구적으로 저장할 수 있습니까?그렇지 않다면, 향후 윈도우즈 CLI에서 UTF-8을 지원하기 위해 공개적으로 발표된 일정이나 의제가 있습니까?
는 개적으사온해용로인온을 사용해 왔습니다.chcp 949
한국어 문자 지원을 위해, 그러나 한국어가 아닌 문자는 지원되지 않는 여러 응용 프로그램(네오빔 등)에서 백슬래시의 이상한 표시와 부정확한/이해할 수 없는 표시949
최근 들어 더욱 문제가 되고 있는 것 같습니다.
참고:
이 대답은 Windows 콘솔에서 문자 인코딩을 다음으로 전환하는 방법을 보여줍니다.
(BOM-less) UTF-8 (코드 페이지)65001
), 그래서 등의 껍질.cmd.exe
및 PowerShell은 Unicode를 완전히 지원하는 외부(콘솔) 프로그램과 통신할 때 문자(텍스트)를 적절하게 인코딩하고 디코딩합니다.cmd.exe
파일 I/[1]O에도 적용됩니다.이와 대조적으로 콘솔 창에서 유니코드 문자 렌더링에 대한 제한 사항이 별도로 있는 경우 이 답변의 중간 및 하단 섹션을 참조하십시오. 여기에서는 대체 콘솔(터미널) 응용 프로그램에 대해서도 설명합니다.
Microsoft는 레지스트리를 수동으로 변경하지 않고 영구적으로 저장할 수 있는 chcp 65001에 대한 개선된/완전한 대안을 제공합니까?
(적어도) Windows 10 버전 1903부터는 시스템 로케일(유니코드가 아닌 프로그램의 언어)을 UTF-8로 설정할 수 있는 옵션이 있지만 이 기능은 이 문서의 현재 베타 버전입니다.
활성화 방법:
- 려달을 합니다.
intl.cpl
- 아래 스크린샷의 지침을 따릅니다.
이렇게 하면 시스템의 활성 OEM 및 ANSI 코드 페이지가 모두 UTF-8 코드 페이지로 설정됩니다. 따라서 (a) 향후 OEM 코드 페이지를 사용하는 모든 콘솔 창이 UTF-8로 기본 설정됩니다.
chcp 65001
되었습니다.cmd.exe
window) 및 (b) 또한 ANSI 코드 페이지를 사용하는 레거시 비 Unicode GUI 하위 시스템 응용 프로그램, UTF-8을 만듭니다.주의사항:
Windows PowerShell을 사용하는 경우 및 Windows PowerShell이 기본값으로 설정되는 기타 컨텍스트도 생성되므로 시스템의 활성 ANSI 코드 페이지(특히 BOM이 없는 파일에서 소스 코드를 읽는 경우)가 UTF-8로 기본 설정됩니다(PowerShell Core(v6+)는 항상 이 작업을 수행합니다).이것은 다음을 의미합니다.
-Encoding
ANSI 인) , BOM-less 은 ANSI로 됩니다.Set-Content
ANSI 인코딩 대신 UTF-8이 될 것입니다.[PowerShell 7.1에서 수정됨] PowerShell 7.0 이상의 기본 .NET 버전(.NET Core 3.1)의 버그로 인해 PowerShell에 후속 버그가 발생합니다. UTF-8 BOM은 설정한 내용에 관계없이 stdin을 통해 외부 프로세스로 전송되는 데이터에 예기치 않게 추가됩니다.
$OutputEncoding
to), 특히 깨집니다. 이 GitHub 문제를 참조하십시오.모든 글꼴이 유니코드를 사용하는 것은 아니므로 TT(TrueType) 글꼴을 선택하십시오. 그러나 일반적으로 모든 문자의 하위 집합만 지원하므로 특정 글꼴을 사용하여 원하는 모든 문자가 표시되는지 실험해야 할 수도 있습니다. 자세한 내용은 이 답변을 참조하십시오.또한 유니코드 렌더링을 더 잘 지원하는 대체 콘솔(터미널) 응용 프로그램에 대해서도 설명합니다.
Eryksun이 지적했듯이, UTF-8을 "말하기"하지 않는 레거시 콘솔 응용 프로그램은 ASCII 전용 입력으로 제한되며 (7비트) ASCII 범위 밖의 문자를 출력하려고 할 때 잘못된 출력을 생성합니다.(이전 버전의 Windows 7 이하에서는 프로그램이 충돌할 수도 있습니다.
레거시 콘솔 응용 프로그램을 실행하는 것이 중요한 경우 의견에서 ryksun의 권장 사항을 참조하십시오.
그러나 윈도우즈 PowerShell의 경우에는 다음과 같이 충분하지 않습니다.
- 또한 기본 설정 변수를 UTF-8로 설정해야 합니다.
$OutputEncoding = [System.Text.UTF8Encoding]::new()
[2]해당 명령을 에 추가하는 것이 가장 간단합니다.$PROFILE
전용) (으)로 표시됩니다.$PROFILE.AllUsersCurrentHost
(모든 사용자) 파일. - 다행히도 내부적으로 BOM-less UTF-8로 일관되게 기본 설정되는 PowerShell Core에서는 더 이상 이 작업이 필요하지 않습니다.
- 또한 기본 설정 변수를 UTF-8로 설정해야 합니다.
사용자 환경에서 시스템 로케일을 UTF-8로 설정하는 것이 옵션이 아닌 경우 다음과 같이 시작 명령을 사용합니다.
참고: 위에서 언급한 주의해야 할 레거시 콘솔 애플리케이션도 여기에 동일하게 적용됩니다.레거시 콘솔 응용 프로그램을 실행하는 것이 중요한 경우 의견에서 ryksun의 권장 사항을 참조하십시오.
PowerShell(두 에디션 모두)의 경우 다음 행을 추가합니다.
$PROFILE
전용) (으)로 표시됩니다.$PROFILE.AllUsersCurrentHost
( 사용자)로, (으)ㄹ 수 있는 파일, ㄹ 수 있는 파일에chcp 65001
변수$OutputEncoding
UTF-8의 파이프라인을 통해 PowerShell에 데이터를 외부 프로그램으로 전송하도록 지시하는 방법:- 실중을 실행하는 하십시오.
chcp 65001
.NET은 시작할 때 콘솔의 출력 인코딩을 캐시하고 나중에 변경된 내용을 인식하지 못하기 때문에 PowerShell 세션 내부에서는 효과적이지 않습니다.chcp
또한 언급한 바와 같이 Windows PowerShell에는 다음과 같은 기능이 필요합니다.$OutputEncoding
설정 - 자세한 내용은 이 답변을 참조하십시오.
- 실중을 실행하는 하십시오.
$OutputEncoding = [console]::InputEncoding = [console]::OutputEncoding = New-Object System.Text.UTF8Encoding
- 예를 들어, 이 줄을 다음에 추가하는 빠르고 더러운 접근법이 있습니다.
$PROFILE
프로그래밍 방식:
'$OutputEncoding = [console]::InputEncoding = [console]::OutputEncoding = New-Object System.Text.UTF8Encoding' + [Environment]::Newline + (Get-Content -Raw $PROFILE -ErrorAction SilentlyContinue) | Set-Content -Encoding utf8 $PROFILE
의 경우 레지스트리를 통해 자동 실행 명령을 정의합니다(값).
AutoRun
중한요.HKEY_CURRENT_USER\Software\Microsoft\Command Processor
전용) (으)로 표시됩니다.HKEY_LOCAL_MACHINE\Software\Microsoft\Command Processor
사용자으)로 표시됨:- 예를 들어 PowerShell을 사용하여 다음과 같은 값을 생성할 수 있습니다.
# Auto-execute `chcp 65001` whenever the current user opens a `cmd.exe` console
# window (including when running a batch file):
Set-ItemProperty 'HKCU:\Software\Microsoft\Command Processor' AutoRun 'chcp 65001 >NUL'
선택적 판독값:Windows PowerShell ISE가 적합하지 않은 이유:
ISE는 콘솔보다 유니코드 렌더링을 더 잘 지원하지만 일반적으로 다음과 같은 방법을 사용하는 것이 좋습니다.
무엇보다도 ISE는 시대에 뒤떨어져 있습니다. PowerShell(Core) 7+를 지원하지 않으며, PowerShell Core용으로 이미 UTF-8을 사용하고 Windows PowerShell용으로 구성할 수 있는 두 PowerShell 에디션의 새로운 프리미어 IDE와 달리 크로스 플랫폼도 지원하지 않습니다.
ISE는 일반적으로 스크립트를 개발하기 위한 환경이지 운영 환경에서 실행하기 위한 환경이 아닙니다(다른 사용자를 위해 스크립트를 작성하는 경우 콘솔에서 실행될 것이라고 가정해야 합니다). 특히 실행 코드와 관련하여 ISE의 동작은 일반 콘솔과 다릅니다.
지원하는 대화형 프로그램이 부족할 뿐만 아니라 다음과 관련하여 외부 프로그램 실행에 대한 지원이 부족합니다(다음 사항 참조:
문자 인코딩: ISE는 외부 프로그램이 기본적으로 ANSI 코드 페이지를 사용한다고 잘못 가정합니다. 실제로는 OEM 코드 페이지입니다.예를 들어, 기본적으로 이 간단한 명령어는 에서 반향된 문자열을 단순히 전달하려고 합니다.
cmd.exe
전체적으로, 오작동(해결 방법은 아래 참조):
cmd /c echo hü | Write-Output
stderr 출력을 PowerShell 오류로 잘못 렌더링: 다음 답변을 참조하십시오.
ISE 도트 소스 스크립트 파일 호출은 하위 범위에서 실행하는 대신(일반 콘솔 창에서 실행되는 것이 후자입니다), 즉 반복 호출은 동일한 범위에서 실행됩니다.이로 인해 이전 실행에서 남긴 정의가 이후 실행에 영향을 줄 수 있는 미묘한 버그가 발생할 수 있습니다.
Eryksun이 지적했듯이 ISE는 대화형 외부 콘솔 프로그램, 즉 사용자 입력이 필요한 프로그램의 실행을 지원하지 않습니다.
문제는 콘솔을 숨기고 프로세스 출력(입력하지 않음)을 파이프로 리디렉션한다는 것입니다.대부분의 콘솔 응용프로그램은 파일이 파이프인 경우 전체 버퍼링으로 전환됩니다.또한 대화형 응용 프로그램은 숨겨진 콘솔 창에서는 불가능한 stdin에서 읽어야 합니다.(숨김 해제는 다음을 통해 수행할 수 있습니다.)
ShowWindow
그러나 입력을 위한 별도의 창은 탁합니다.)
이러한 제한을 감수할 의사가 있는 경우 활성 코드 페이지를 다음으로 전환합니다.
65001
하려면 어색한 해결먼저 내장된 콘솔에서 외부 프로그램을 실행하여 숨겨진 콘솔 창을 강제로 만들어야 합니다.
chcp
콘솔 창이 짧게 깜박이는 것을 볼 수 있습니다.그래야만 설정할 수 있습니다.
[console]::OutputEncoding
)$OutputEncoding
에서 UTF-8로아직 경우에는 UTF-8로 합니다).handle is invalid error
).
PowerShell에서 외부 프로그램을 호출하지 않는 경우 시스템 로케일(활성 코드 페이지)에 대해 걱정할 필요가 없습니다.PowerShell 네이티브 명령 및 .NET 호출은 항상 UTF-16 문자열(네이티브 .NET 문자열)을 통해 통신하며, 파일 I/O에서는 시스템 로케일과 독립적인 기본 인코딩을 적용합니다.마찬가지로 Windows API 함수의 Unicode 버전은 콘솔에서 인쇄하고 읽기 위해 사용되므로 ASCII가 아닌 문자는 항상 올바르게 인쇄됩니다(콘솔의 렌더링 제한 내).cmd.exe
으로 시스템O에 합니다.<
그리고.>
코드에 대해 하여, 내의 하는 것뿐만 예: 프로그램 때), 리다이렉션(redirection 배치 파일 소스 코드에 대해 가정할 인코딩을 포함합니다.for /f
PowerShell v4-dll은 다음과 .::new()
사용할 수 . 할 수 없습니다. 사용$OutputEncoding = (New-Object System.Text.UTF8Encoding).psobject.BaseObject
이유는 GitHub 이슈 #5763을 참조하십시오..psobject.BaseObject
부품이 필요합니다.
를 입력하면 됩니다.chcp 65001
Powershell 프로파일에서 Powershell을 열면 자동으로 실행됩니다.그러나 cmd.exe에 대해서는 아무 것도 할 수 없습니다.
Microsoft는 현재 유니코드를 완전히 지원하는 개선된 터미널을 개발하고 있습니다.Windows 10 버전 1903 이상을 사용하는 경우 이미 미리 보기 버전을 다운로드할 수 있습니다.
또는 터미널과 같은 타사 터미널 에뮬레이터를 사용할 수 있습니다.
명령 (일부 명입력령(력입▁typing()chcp
명령 프롬프트를 시작할 때마다 레지스트리 편집을 수행할 수 있습니다.올바른 방법은 다음에 설명되어 있습니다.CMD /?
:
명령줄에 /D를 지정하지 않은 경우 CMD.EXE가 시작되면 다음 REG_SZ/REG_EXPAND_SZ 레지스트리 변수를 찾고 둘 중 하나 또는 둘 다 있으면 먼저 실행됩니다.
HKEY_LOCAL_MACHINE\Software\Microsoft\Command Processor\AutoRun and/or HKEY_CURRENT_USER\Software\Microsoft\Command Processor\AutoRun
이제 2023년이고 좋은 소식입니다.윈도우즈 터미널에서는 레지스트리를 편집하거나 추가 배치 파일을 만들 필요가 없습니다.Windows Terminal에서 Settings > Profiles(설정 > 프로파일)로 이동하여 Command Prompt(명령 프롬프트)를 찾은 다음 명령줄을 다음에서 변경합니다.%SystemRoot%\System32\cmd.exe
에서 (으)로 ~%SystemRoot%\System32\cmd.exe /K "chcp 65001"
간단합니다.
파워셸 ISE는 한국어를 완벽하게 잘 표시합니다.다음은 utf8로 인코딩된 샘플 텍스트 파일입니다.
PS C:\Users\js> cat .\korean.txt
The Korean language (South Korean: 한국어/韓國語 Hangugeo; North
Korean: 조선말/朝鮮말 Chosŏnmal) is an East Asian language
spoken by about 77 million people.[3]
ISE는 모든 버전의 Windows 10과 함께 제공되기 때문에, 저는 그것이 구식이라고 생각하지 않습니다.저는 제 원래 답변을 삭제한 사람에게 동의하지 않습니다.
ISE에는 몇 가지 제한이 있지만 일부 스크립팅은 외부 명령을 사용하여 수행할 수 있습니다.
echo 'list volume' | diskpart # as admin
cmd /c echo hi
편집:
Windows 10 1903을 사용하는 경우 Microsoft Store https://devblogs.microsoft.com/commandline/introducing-windows-terminal/, 에서 Windows Terminal을 다운로드할 수 있으며 한국어 텍스트도 사용할 수 있습니다.Powershell 5는 텍스트 형식이 UTF8이고 bom 또는 UTF16이어야 합니다.
EDIT2:
이상적인 것은 문자를 붙여넣는 것과 출력하는 것 모두에서 윈도우 터미널 + 파워셸 7 또는 vscode + 파워셸 7인 것 같습니다.
EDIT3:
에서도 EDIT2 상서도일부유니문붙수없다습니여자을넣는과 같은 유니코드 수 .⇆
(U+21C6) 또는 유니코드 공백입니다.Osx의 PS7만 작동합니다.
언급URL : https://stackoverflow.com/questions/57131654/using-utf-8-encoding-chcp-65001-in-command-prompt-windows-powershell-window
'code' 카테고리의 다른 글
AD 토큰을 포함한 가져오기 요청에 대한 AzureBob 스토리지 "인증 권한 불일치" 오류 (0) | 2023.05.18 |
---|---|
LINQ를 사용하여 순서 유지 (0) | 2023.05.18 |
postgresql 포트 혼란 5433 또는 5432? (0) | 2023.05.18 |
이 빌드 중 "코드 9009로 종료"는 무엇을 의미합니까? (0) | 2023.05.18 |
Angular4로 업그레이드한 후 'require' 이름을 찾을 수 없습니다. (0) | 2023.05.13 |