Windows 시스템 로케일이 UTF-8 코드 페이지를 사용하는지 감지하는 스크립트?
최신 버전의 Win10에서는 ACP (Active Code Page)를 UTF-8 코드 페이지로 설정할 수 있습니다. 여기 에 설명 된대로 UTF-8 코드 페이지를 사용하도록 시스템 로케일 (Windows API의 "A"버전과 "W"버전 사이에 매핑하는 데 사용됨)을 설정할 수 있습니다.
스크립트는 UTF-8 코드 페이지가 사용 중인지 어떻게 감지합니까?
여기 와 여기에 설명 된대로 일반적으로 WMI를 사용하여 시스템 코드 페이지 ID를 가져올 수 있습니다.
For Each os In wmi.ExecQuery("SELECT * FROM Win32_OperatingSystem")
cs = os.CodeSet
Next
Win10에서 비 유니 코드 프로그램에 대해 미국 영어로 '베타'utf-8 지원을 사용하도록 설정하면 WMI는 코드 페이지가 1252라고 계속보고합니다. 분명히 그렇지는 않지만 (코드 페이지 1252에는 128에 코드 포인트가 있지만 49800에 없음 : UTF-8에는 코드 포인트가 49800에 있고 128에 없음).
스크립트는 실제 시스템 로케일이 UTF-8 코드 페이지를 사용하고 있음을 어떻게 감지합니까?
답변
PowerShell (셸 기반) 솔루션 :
확인하려면 시스템 로케일 의 (시스템 전체) OEM 코드 페이지 -에서 사용하는 하나 콘솔 응용 프로그램 , 레지스트리를 사용합니다 :
# $true, if the OEM code page is set to UTF-8 (code page 65001)
'65001' -eq (Get-ItemPropertyValue HKLM:\SYSTEM\CurrentControlSet\Control\Nls\CodePage OEMCP)
노트 :
은 Using 시스템 전체의 UTF-8을 지원하는 것은 또한 ANSI 코드 페이지 (세트
ACP
로)65001
에 의해 사용, 기존의 GUI 애플리케이션을 하지만, 특히 또한 Windows PowerShell을 [1] , 수단 그 용 Windows PowerShell의 기본 인코딩Get-Content
및Set-Content
예를 들어 cmdlet를 변경.에서를
cmd.exe
실행할 수
reg.exe query HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Nls\CodePage /v OEMCP
있지만 텍스트 출력을 구문 분석하여 코드 페이지 번호 만 추출해야합니다.유감스럽게도, PowerShell을의 것을 참고 Get-WinSystemLocale때문에 cmdlet을,이 글을 쓰는으로 사용할 수 없습니다
[cultureinfo]
가 반환 인스턴스가 않습니다 없는 장소에있을 수있는 UTF-8 재정의를 반영은 - 볼 이에 Serverfault 대답을 .
현재 콘솔 의 활성 OEM 코드 페이지 를 확인하려면 -콘솔 창을 사용자 지정 코드 페이지를 사용하도록 구성 할 수 있고 코드 페이지를 세션에서 미리 변경했을 수도 있기 때문에 시스템 로캘을 반영하거나 반영하지 않을 수 있습니다.
# $true, if the OEM code page is set to UTF-8 (code page 65001)
65001 -eq [Console]::OutputEncoding.CodePage
노트 :
- 를
cmd.exe
실행할 수chcp
chcp.com
는 있지만 텍스트 출력을 구문 분석하여 코드 페이지 번호 만 추출해야합니다.
Windows API 기반 솔루션 :
컴파일 된 응용 프로그램에서 GetACP () 및 GetOEMCP () Windows API 함수를 사용하여 활성 ANSI 및 OEM 코드 페이지를 각각 쿼리 할 수 있습니다.
PowerShell에서도 그렇게 할 수 있습니다 (주문형 컴파일이 필요하다는 사실로 인해 레지스트리 솔루션이 가장 선호됩니다).
# Compile a helper type that calls the WinAPI functions.
Add-Type -Namespace Util -Name WinApi -MemberDefinition @'
[DllImport("Kernel32.dll")]
public static extern uint GetACP();
[DllImport("Kernel32.dll")]
public static extern uint GetOEMCP();
'@
[Util.WinAPI]::GetOEMCP(), [Util.WinAPI]::GetACP()
노트 :
- 컴파일 된 애플리케이션이 콘솔 애플리케이션이고 연관된 콘솔의 현재 OEM 코드 페이지 ( 시스템 로케일을 통해 설정된 기본 페이지 일 수도 있고 아닐 수도 있음) 를 알고 싶다면 GetConsoleOutputCP()대신 함수를 사용하십시오 .
[1] 활성 ANSI 코드 페이지는 더 이상 cmdlet에 BOM이없는 UTF-8을 일관되게 사용하는 PowerShell [Core] v6 + 와 관련이 없지만 Windows에서는에 반영된 활성 OEM 코드 페이지 [Console]::OutputEncoding
가 통신 할 때 여전히 중요합니다. 외부 프로그램 .