다음을 통해 공유


Windows 앱에서 UTF-8 코드 페이지 사용

웹앱과 기타 *nix 기반 플랫폼(Unix, Linux 및 변형) 간의 최적 호환성을 위해 UTF-8 문자 인코딩을 사용하고, 지역화 버그를 최소화하고, 테스트 오버헤드를 줄입니다.

UTF-8은 국제화를 위한 유니버설 코드 페이지이며 전체 유니코드 문자 집합을 인코딩할 수 있습니다. 웹에서 널리 사용되며 *nix 기반 플랫폼의 기본 방식입니다.

프로세스 코드 페이지를 UTF-8로 설정

Windows 버전 1903(2019년 5월 업데이트)부터 패키지된 앱의 경우 appxmanifest, 패키지되지 않은 앱의 경우 fusion 매니페스트의 ActiveCodePage 속성을 사용하여 강제로 프로세스가 프로세스 코드 페이지로 UTF-8을 사용하도록 할 수 있습니다.

참고 항목

현재 GDI는 프로세스당 ActiveCodePage 속성 설정을 지원하지 않습니다. 대신 GDI는 기본적으로 활성 시스템 코드 페이지로 설정됩니다. GDI를 통해 UTF-8 텍스트를 렌더링하도록 앱을 구성하려면 Windows Settings>Time & language>Language & region>Administrative language settings>Change 시스템 로캘로 가서, 베타: 전 세계 언어 지원에 Unicode UTF-8 사용을 확인합니다. 그런 다음 PC를 재부팅하여 변경 사항을 적용합니다.

ActiveCodePage 속성을 선언하고 이전 Windows 빌드를 대상으로 하여 이 빌드에서 실행할 수 있지만 레거시 코드 페이지 검색 및 변환을 평소처럼 처리해야 합니다. Windows 버전 1903의 최소 대상 버전을 사용하는 경우 프로세스 코드 페이지는 항상 UTF-8이므로 레거시 코드 페이지를 검색하고 변환을 피할 수 있습니다.

참고 항목

인코딩된 문자는 1~4바이트를 차지합니다. UTF-8 인코딩은 최대 6바이트의 좀 더 긴 바이트 시퀀스를 지원하지만 유니코드 6.0의 가장 큰 코드 포인트(U+10FFFF)는 4바이트만 사용합니다.

예제

패키지된 앱에 대한 Appx 매니페스트:

<?xml version="1.0" encoding="utf-8"?>
<Package xmlns="http://schemas.microsoft.com/appx/manifest/foundation/windows10"
         ...
         xmlns:uap7="http://schemas.microsoft.com/appx/manifest/uap/windows10/7"
         xmlns:uap8="http://schemas.microsoft.com/appx/manifest/uap/windows10/8"
         ...
         IgnorableNamespaces="... uap7 uap8 ...">

  <Applications>
    <Application ...>
      <uap7:Properties>
        <uap8:ActiveCodePage>UTF-8</uap8:ActiveCodePage>
      </uap7:Properties>
    </Application>
  </Applications>
</Package>

패키지되지 않은 Win32 앱에 대한 Fusion 매니페스트:

<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<assembly manifestVersion="1.0" xmlns="urn:schemas-microsoft-com:asm.v1">
  <assemblyIdentity type="win32" name="..." version="6.0.0.0"/>
  <application>
    <windowsSettings>
      <activeCodePage xmlns="http://schemas.microsoft.com/SMI/2019/WindowsSettings">UTF-8</activeCodePage>
    </windowsSettings>
  </application>
</assembly>

참고 항목

mt.exe -manifest <MANIFEST> -outputresource:<EXE>;#1를 사용하여 명령줄에서 기존 실행 파일에 매니페스트를 추가합니다.

-A 대 -W API

Win32 API는 종종 -A 및 -W 변형을 모두 지원합니다.

-A 변형은 시스템에 구성된 ANSI 코드 페이지를 인식하고 char*를 지원하지만 -W 변형은 UTF-16에서 작동되며 WCHAR을 지원합니다.

최근까지 Windows는 “유니코드” -A API보다 -W 변형을 강조했습니다. 그러나 최근 릴리스에서는 앱에 UTF-8 지원을 도입하기 위한 수단으로 ANSI 코드 페이지 및 -A API를 사용했습니다. ANSI 코드 페이지가 UTF-8용으로 구성된 경우 일반적으로 -A API는 UTF-8에서 작동합니다. 이 모델은 코드를 변경하지 않고 -A API로 빌드된 기존 코드를 지원할 수 있다는 이점을 제공합니다.

코드 페이지 변환

Windows는 기본적으로 UTF-16 (WCHAR)에서 작동하므로 Windows API와 상호 운용하려면 UTF-8 데이터를 UTF-16로(또는 그 반대로) 변환해야 할 것입니다.

MultiByteToWideCharWideCharToMultiByte를 사용하면 UTF-8과 UTF-16(WCHAR)(및 다른 코드 페이지) 간을 변환할 수 있습니다. 이것은 레거시 Win32 API가 WCHAR만 식별할 때 특히 유용합니다. 이러한 함수를 사용하면 UTF-8 입력을 WCHAR로 변환하여 -W API로 전달하고 필요한 경우 결과를 다시 변환할 수 있습니다.

CodePageCP_UTF8로 설정된 상태에서 이러한 기능을 사용할 경우 0 또는 MB_ERR_INVALID_CHARSdwFlags를 사용합니다(아닌 경우는 ERROR_INVALID_FLAGS 발생).

참고 항목

CP_ACP는 Windows 버전 1903(2019년 5월 업데이트) 이상에서 실행 중이고 위에서 설명한 ActiveCodePage 속성이 UTF-8로 설정된 경우에만 CP_UTF8과 같아집니다. 그렇지 않은 경우 레거시 시스템 코드 페이지를 따릅니다. 명시적으로 CP_UTF8을 사용하는 것이 좋습니다.