Windows Server 2019에서 세계화 API가 ICU 라이브러리를 사용
.NET 7 이상 버전에서는 Windows Server 2019에서 실행되는 경우 세계화 기능에 ICU(International Components for Unicode) 라이브러리를 사용합니다. Windows의 비서버 버전은 .NET 5부터 ICU를 사용합니다. 그러나 .NET 7은 이전 Windows 클라이언트 버전, 특히 Windows 10 버전 1703, 1709, 1803 및 1809에서 ICU를 로드하는 지원을 도입했습니다.
이전 동작
.NET 5 및 .NET 6에서 .NET 라이브러리는 Windows Server 2019의 세계화 기능에 NLS(국가별 언어 지원) API를 사용했습니다. 예를 들어 NLS 함수는 문자열 비교, 문화권 정보 가져오기, 해당 문화권에서 문자열 대/소문자 구분 수행에 사용되었습니다. 이 동작은 Windows 10 클라이언트 버전(예: 1703, 1709, 1803 및 1809)에도 적용됩니다.
새 동작
.NET 7부터 앱이 Windows Server 2019 또는 Windows 10 클라이언트 버전 1703, 1709, 1803, 1809에서 실행되는 경우 .NET 라이브러리는 기본적으로 ICU 세계화 API를 사용합니다. (서버가 아닌 Windows 버전은 이미 .NET 5 이후에 ICU를 사용해왔습니다. 이러한 버전에서는 변경된 내용이 없기 때문입니다.)
동작의 차이
세계화 기능을 사용 중임을 인식하지 못하는 경우에도 앱에 변경 내용이 표시될 수 있습니다. 다음 예제에서는 표시될 수 있는 동작 변경 중 하나를 보여 주지만 다른 변경도 있습니다.
통화 기호
통화 형식 지정자 C
를 사용하여 문자열의 형식을 지정하는 다음 코드를 사용하는 것이 좋습니다. 현재 스레드의 문화권은 국가 또는 지역이 아니라 언어만 포함하는 문화권으로 설정되어 있습니다.
System.Threading.Thread.CurrentThread.CurrentCulture = new System.Globalization.CultureInfo("de");
string text = string.Format("{0:C}", 100);
- Windows Server 2019 또는 Windows 10 클라이언트 버전 1703, 1709, 1803, 1809의 .NET 5 및 .NET 6에서는 텍스트 값이
"100,00 €"
입니다. - Windows Server 2019 또는 Windows 10 클라이언트 버전 1703, 1709, 1803, 1809의 .NET 7에서 텍스트 값은 유로 대신 국제 통화 기호를 사용하는
"100,00 ¤"
입니다. ICU의 의도는 통화가 언어가 아닌 국가 또는 지역의 속성이라는 것입니다.
변경 이유
- .NET에는 ICU 라이브러리에 의존하는 일부 API(예: TimeZoneInfo.TryConvertIanaIdToWindowsId(String, String))가 도입되었습니다. Windows Server 2019에서 이러한 API를 사용하려는 사용자는 ICU 앱 로컬 기능을 사용하여 이진 파일로 ICU 라이브러리를 수동으로 배포해야 했습니다. 코드가 라이브러리를 사용하는 앱이나 서비스에서 ICU 라이브러리를 강제로 설치하도록 제어할 수 없는 라이브러리에 있을 수 있기 때문에 이 방법은 좋은 솔루션이 아니었습니다.
- Windows Server 2019가 클라우드 플랫폼(예: Azure)에서 자동으로 제공되는 경우 배포된 서비스가 해당 서버에서 실행될 것임을 반드시 알지는 못합니다. 또한 서비스 소유자는 ICU 이진 파일을 배포할지 여부 및 배포 시기를 관리해야 합니다. 또한 새 .NET ICU 종속 API를 사용하려는 Windows Server 2019를 사용하여 클라우드에 배포된 모든 서비스는 서비스와 함께 ICU 이진 파일을 배포해야 합니다. 이렇게 하면 서버의 디스크 크기가 블로트될 수 있습니다.
- 일부 사용자는 ICU가 유니코드 표준을 더 잘 준수하기 때문에 기본적으로 ICU를 사용하는 것을 선호합니다.
도입된 버전
.NET 7
권장 조치
Windows Server 2019 또는 Windows 10 클라이언트 버전 1703, 1709, 1803, 1809에서 .NET 7을 사용하는 경우 앱 또는 서비스를 배송하기 전에 테스트하여 동작이 예상대로 수행되고 사용자의 작업을 중단하지 않도록 하는 것이 좋습니다.
NLS 세계화 API를 계속 사용하려는 경우 런타임 스위치를 설정하여 해당 동작으로 되돌릴 수 있습니다. 사용 가능한 스위치에 대한 자세한 내용은 .NET 세계화 및 ICU 문서를 참조하세요.
영향을 받는 API
- System.Span<T>
- System.String
- System.Globalization 네임스페이스의 대부분의 형식
- System.Array.Sort(문자열 배열을 정렬하는 경우)
- System.Collections.Generic.List<T>.Sort()(목록 요소가 문자열인 경우)
- System.Collections.Generic.SortedDictionary<TKey,TValue>(키가 문자열인 경우)
- System.Collections.Generic.SortedList<TKey,TValue>(키가 문자열인 경우)
- System.Collections.Generic.SortedSet<T>(집합에 문자열이 포함된 경우)
추가 정보
.NET