마이크로소프트 윈도우의 유니코드

Unicode in Microsoft Windows

마이크로소프트는 제품에 유니코드를 구현한 최초의 기업 중 하나였습니다.윈도우 NT시스템 호출에 "와이드 문자"를 사용한 최초의 운영체제였습니다.처음에는 (이제는 더 이상 사용되지 않는) UCS-2 인코딩 체계를 사용하여 Windows 2000부터 가변 너비 인코딩 UTF-16으로 업그레이드되어 대리 쌍을 가진 추가 평면을 표현할 수 있게 되었습니다.그러나 마이크로소프트는 2019년 5월까지 API에서 UTF-8을 지원하지 않았습니다.

2019년 이전에 마이크로소프트는 UTF-16(즉, -W API)을 강조했지만, 그 이후로 윈도우와 엑스박스에서 [1]UTF-8을 사용할 것을 권고했으며, 심지어 "UTF-8은 국제화를 위한 보편적인 코드 페이지이며, 윈도우가 여러 플랫폼을 대상으로 하는 코드에 부여하는 독특한 부담입니다.[..] Windows는 UTF-8을 지원하여 앱과 게임의 국제화 문제를 줄일 수 있도록 노력하고 있습니다."[2]

많은 양의 마이크로소프트 문서에서는 "유니코드"라는 단어를 사용하여 UTF-16 인코딩을 명시적으로 언급합니다.UTF-8을 포함한 다른 것들은 마이크로소프트의 구식 언어로 된 "유니코드"가 아닙니다. UTF-8과 UTF-16은 모두 유니코드 표준에 따른 유니코드이거나 의 인코딩/"변환 형식"입니다.

다양한 Windows 패밀리에서

윈도 NT 기반 시스템

현재 Windows 버전과 Windows XP 및 이전 Windows NT(3.x, 4.0)로 돌아가는 모든 버전은 16비트 "유니코드"(Windows 2000 이후 UTF-16)와 "코드 페이지"(또는 ANSI 코드 페이지라고 잘못 지칭됨)라는 (때로는 멀티바이트) 인코딩을 지원하는 시스템 라이브러리와 함께 제공됩니다.16비트 함수에는 다음과 같은 'W'(wide에서 온)로 접미사가 붙은 이름이 있습니다.SetWindowTextW. 코드 페이지 지향 함수는 다음과 같은 ANSI의 접미사 'A'를 사용합니다.SetWindowTextA(다른 시스템에서 복사된 API에 사용된 다른 규칙은 다음과 같습니다._wfopen/fopen아니면wcslen/strlenC를 포함한 많은 언어들이 8비트와 16비트 문자열을 동일한 함수에 전달하는 명확한 방법을 제공하지 못했기 때문에 이러한 분할이 필요했습니다.

마이크로소프트는 컴파일러에 "UNICode" 스위치를 제공함으로써 유니코드를 "portable"로 지원하려고 시도했는데, 이 스위치는 채워지지 않은 "일반적인" 호출을 "A" 인터페이스에서 "W" 인터페이스로 전환하고 모든 문자열 상수를 "wide" UTF-16 버전으로 변환합니다.[3][4]이것은 UTF-8을 문자열 상수 밖으로 변환하지 않기 때문에 실제로 작동하지 않습니다. 따라서 파일을 열려고 시도하는 코드가 컴파일되지 않기 때문입니다.[citation needed]

이전에 Windows는 "UNICode" 스위치와 독립적으로 MBCS(Multibyte Character Sets) API 스위치를 제공했습니다.[5]이것은 MBCS에서 작동하지 않는 일부 기능을 바꿉니다.strrev다음과 같이 MBCS를 인식하는 사람에게_mbsrev.[6][7]

윈도우 CE

(현재는 단종된) 윈도우 CE에서 UTF-16은 거의 독점적으로 사용되었으며, 'A' API는 대부분 누락되었습니다.[8]Windows CE 5.0에서는 ANSI API의 제한된 세트를 사용하여 런타임 이미지에 선택적으로 구축할 수 있는 축소된 로케일 세트에서 사용할 수 있습니다.[9]

윈도우 9x

2001년, 마이크로소프트는 마이크로소프트의 오래된 윈도우 9x 시스템에 대한 특별한 부록을 발표했습니다.윈도 API의 모든 기본 기능 중 16비트 맛(끝에 W자가 있는 것)을 담고 있는 동적 링크 라이브러리인 'unicows.dll'(단 240KB)이 포함되어 있습니다.이것은 단지 번역 계층일 뿐입니다.SetWindowTextW단순히 현재 코드 페이지와 통화를 사용하여 입력을 변환할 것입니다.SetWindowTextA.

UTF-8

Microsoft Windows(Windows XP 이상)에는 UTF-8용으로 지정된 코드 페이지, 코드 페이지 65001[10] 또는CP_UTF8. 오랫동안 로케일 코드 페이지를 65001로 설정할 수 없었고, 이 코드 페이지는 (a) MultiByteToWideChar 및/또는 (b) Win32 콘솔 명령과 같은 명시적인 변환 기능에만 사용할 수 있었습니다.chcp 65001UTF-8과 UTF-16 사이의 stdin/out을 번역합니다.이것은 특히 "좁은" 기능을 의미했습니다.fopen(파일을 여는 것) UTF-8 문자열로 호출할 수 없었고, 실제로 모든 가능한 파일을 열 수 있는 방법은fopen로케일이 무엇으로 설정되었는지 및/또는 문자열에 어떤 바이트를 넣었는지에 관계없이, 사용 가능한 로케일 중 어느 것도 가능한 모든 UTF-16 문자를 생성할 수 없기 때문입니다.이 문제는 다음과 같은 윈도우 문자열을 포함하여 8비트 문자열을 가져오거나 반환하는 다른 모든 API에도 적용되었습니다.SetWindowText.

UTF-8을 사용하고자 하는 프로그램, 특히 다른 운영 체제에 휴대할 수 있도록 설계된 코드는 이러한 결함에 대한 해결책이 필요했습니다.일반적인 해결책은 MultiByteToWideChar를 사용하여 UTF-8을 UTF-16으로 변환하는 파일을 열기 위해 새로운 기능을 추가하고 대신 "wide" 기능을 호출하는 것이었습니다.fopen.[11]수십 개의[11] 멀티 플랫폼 라이브러리가 Windows에서 이러한 변환을 수행하기 위해 래퍼 기능을 추가하였으며(다른 라이브러리에서는 UTF-8을 변경되지 않고 통과), 그 로는 Boost에 제안된 추가 기능이 있습니다.을 내요. 안 요.[12]또 다른 인기있는 해결책은 이름을 8.3 파일 이름과 동등한 파일 이름으로 변환하는 것이었습니다. 이것은 만약 필요합니다.fopen도서관 안에 있습니다.이러한 해결 방법은 Windows(윈도우)가 아닌 곳에서 작동하는 코드를 변경해야 하기 때문에 적합한 것으로 간주되지 않습니다.

2018년 4월(또는 2017년[13] 11월) 윈도우 10용 내부 빌드 17035(이름 빌드 17134)와 함께 로케일 코드 페이지를 UTF-8로 설정하는 "베타: 전 세계 언어 지원을 위해 유니코드 UTF-8 사용" 확인란이 나타났습니다.[a]이를 통해 다음과 같은 "좁은" 함수를 호출할 수 있습니다.fopen그리고.SetWindowTextA, UTF-8 끈으로그러나 이 설정은 시스템 전체 설정이므로 프로그램에서 설정된 것으로 가정할 수 없습니다.

2019년 5월, 마이크로소프트는 코드 페이지를 UTF-8 자체로 설정할 수 있는 기능을 추가하여 [1][14]UTF-8을 사용하기 위해 작성된 프로그램을 전문가가 아닌 사용자가 실행할 수 있도록 했습니다.

2019년 현재,[1] 마이크로소프트는 프로그래머들이 윈도우와 엑스박스에서 UTF-8을 사용할 것을 권고하고 있으며, UTF-16 대신 UTF-8을 사용할 것을 권고하고 있으며, 심지어 "UTF-8은 국제화를 위한 보편적인 코드 페이지이며, UTF-16은 윈도우가 여러 플랫폼을 대상으로 하는 코드에 부여하는 독특한 부담입니다."[2]라고 명시할 수도 있습니다.마이크로소프트는 UTF-8로 전환하는 것으로 보이는데, 이전에 그 대안을 강조한 적이 있으며, 윈도우 11에서는 일부 시스템 파일이 UTF-8을 사용해야 하며 바이트 순서 표시가 필요하지 않습니다.[15]메모장은 이제 바이트 순서 표시 없이 UTF-8을 인식할 수 있으며, 바이트 순서 표시 없이 UTF-8을 쓰라고 지시받을 수 있습니다.[citation needed]Visual Studio[citation needed]SQL Server 2019를 포함한 일부 다른 Microsoft 제품은 내부적으로 UTF-8을 사용하고 있으며, Microsoft는 UTF-8 사용에 따른 속도가 35% 향상되고 "스토리지 요구 사항이 거의 50% 감소"된다고 주장하고 있습니다.[16]

프로그래밍 플랫폼

마이크로소프트의 컴파일러는 UTF-8 소스 파일에서 UTF-8 문자열 상수를 생성하지 못하는 경우가 많습니다.가장 신뢰할 수 있는 방법은 UNICO를 끄는 것이며, 입력 파일을 UTF-8로 표시하지 않고(즉, BOM을 사용하지 않음), 문자열 상수를 UTF-8 바이트로 배열하는 것입니다.BOM이 추가되면 Microsoft 컴파일러는 문자열을 UTF-8로 해석하여 UTF-16으로 변환한 다음 현재 로케일로 변환하여 UTF-8을 제거합니다.[17] BOM이 없고 단일 바이트 로케일을 사용하지 않으면 Microsoft 컴파일러는 따옴표로 묶은 문자열의 바이트를 변경하지 않고 그대로 둡니다.현대의 시스템에서는 코드 페이지를 UTF-8로 설정하는 것이 상당히 도움이 되지만 여전히 유효하지 않은 바이트 시퀀스는 보존되지 않습니다.\x이를 해결할 수 있습니다).

참고 항목

메모들

  1. ^ 제어판의 "지역" 항목, "관리" 탭, "시스템 로케일 변경" 버튼 아래에 있습니다.

참고문헌

  1. ^ a b c "Use UTF-8 code pages in Windows apps". learn.microsoft.com. Retrieved 2020-06-06. As of Windows version 1903 (May 2019 update), you can use the ActiveCodePage property in the appxmanifest for packaged apps, or the fusion manifest for unpackaged apps, to force a process to use UTF-8 as the process code page. [...] CP_ACP equates to CP_UTF8 only if running on Windows version 1903 (May 2019 update) or above and the ActiveCodePage property described above is set to UTF-8. Otherwise, it honors the legacy system code page. We recommend using CP_UTF8 explicitly.
  2. ^ a b "UTF-8 support in the Microsoft Game Development Kit (GDK) - Microsoft Game Development Kit". learn.microsoft.com. 19 August 2022. Retrieved 2023-03-05. By operating in UTF-8, you can ensure maximum compatibility [..] Windows operates natively in UTF-16 (or WCHAR), which requires code page conversions by using MultiByteToWideChar and WideCharToMultiByte. This is a unique burden that Windows places on code that targets multiple platforms. [..] The Microsoft Game Development Kit (GDK) and Windows in general are moving forward to support UTF-8 to remove this unique burden of Windows on code targeting or interchanging with multiple platforms and the web. Also, this results in fewer internationalization issues in apps and games and reduces the test matrix that's required to get it right.
  3. ^ "Unicode in the Windows API". Retrieved 7 May 2018.
  4. ^ "Conventions for Function Prototypes (Windows)". MSDN. Retrieved 7 May 2018.
  5. ^ "Support for Multibyte Character Sets (MBCSs)". Retrieved 2020-06-15.
  6. ^ "Double-byte Character Sets". MSDN. 2018-05-31. Retrieved 2020-06-15. our applications use DBCS Windows code pages with the "A" versions of Windows functions.
  7. ^ _strrev, _wcsrev, _mbsrev, _mbsrev_l Microsoft 문서
  8. ^ "Differences Between the Windows CE and Windows NT Implementations of TAPI". MSDN. 28 August 2006. Retrieved 7 May 2018. Windows CE is Unicode-based. You might have to recompile source code that was written for a Windows NT-based application.
  9. ^ "Code Pages (Windows CE 5.0)". Microsoft Docs. 14 September 2012. Retrieved 7 May 2018.
  10. ^ "Code Page Identifiers (Windows)". msdn.microsoft.com. 7 January 2021.
  11. ^ "UTF-8 in Windows". Stack Overflow. Retrieved July 1, 2011.
  12. ^ "Boost.Nowide". GitHub.
  13. ^ "Windows10 Insider Preview Build 17035 Supports UTF-8 as ANSI". Hacker News. Retrieved 7 May 2018.
  14. ^ "Windows 10 1903 and later versions finally support UTF-8 with the A forms of the Win32 functions".
  15. ^ "Customize the Windows 11 Start menu". docs.microsoft.com. Retrieved 2021-06-29. Make sure your LayoutModification.json uses UTF-8 encoding.
  16. ^ "Introducing UTF-8 support for SQL Server". techcommunity.microsoft.com. 2019-07-02. Retrieved 2021-08-24. For example, changing an existing column data type from NCHAR(10) to CHAR(10) using an UTF-8 enabled collation, translates into nearly 50% reduction in storage requirements. [..] In the ASCII range, when doing intensive read/write I/O on UTF-8, we measured an average 35% performance improvement over UTF-16 using clustered tables with a non-clustered index on the string column, and an average 11% performance improvement over UTF-16 using a heap.
  17. ^ UTF-8 Everywhere FAQ: C++ 코드에 UTF-8 문자열 리터럴을 쓰는 방법은 무엇입니까?

외부 링크