Windows 시스템 로케일이 UTF-8 코드 페이지를 사용하는지 감지하는 스크립트?

Nov 21 2020

최신 버전의 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 코드 페이지를 사용하고 있음을 어떻게 감지합니까?

답변

4 mklement0 Nov 21 2020 at 12:19

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-ContentSet-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가 통신 할 때 여전히 중요합니다. 외부 프로그램 .