NLS 정렬 변경 내용

영향을 받는 플랫폼

클라이언트 - Windows XP, Windows Vista, Windows 7
서버 - Windows Server 2003, Windows Server 2008, Windows Server 2008 R2

기능 영향

심각도 - 높음
빈도 - 낮음(영향을 받는 앱은 거의 없지만 영향을 받는 경우 항상 손상됨)

설명

NLS(국가 언어 지원) 기능은 애플리케이션이 전 세계 사용자의 다양한 언어 및 로캘별 요구 사항을 지원하는 데 도움이 됩니다. 새 Windows 버전에는 거의 변함없이 NLS 변경 내용이 포함됩니다. 이 변경 내용은 데이터 정렬 및 정렬에 영향을 주므로 영구 인덱스가 있는 애플리케이션에 영향을 줍니다.

데이터 정렬 테이블에는 해당 버전(수정 버전)을 식별하는 두 개의 숫자, 즉 정의된 버전과 NLS 버전이 있습니다. 두 버전 모두 주 버전과 부 버전으로 구성된 DWORD 값입니다. 값의 첫 번째 바이트는 예약되고, 다음 두 바이트는 주 버전을 나타내고, 마지막 바이트는 부 버전을 나타냅니다. 16진수 측면에서 패턴은 0xRRMMMMmm입니다. 여기서 R은 Reserved, M은 주 및 m은 부와 같습니다. 예를 들어 부 버전이 4인 주 버전 3은 0x304 표시됩니다.

주 버전의 경우 애플리케이션이 비교가 유효하도록 모든 데이터를 다시 인덱싱해야 하므로 하나 이상의 코드 포인트가 변경됩니다. 부 버전의 경우 아무 것도 이동하지 않지만 코드 포인트가 추가됩니다. 이 버전의 경우 애플리케이션은 이전에 정렬할 수 없는 값으로 문자열을 다시 인덱싱해야 합니다. 요약하면 로캘별 예외 테이블 및 기본 테이블의 데이터 변경 내용과 관련하여 버전 번호의 의미는 다음과 같습니다.

NLSVersion 주 – '예외' 또는 로캘별 테이블의 코드 포인트 변경
NLSVersion 부 – 'exception' 또는 로캘별 테이블에 새 코드 포인트가 추가됨
DefinedVersion 주 – 기본 테이블의 코드 포인트 변경
DefinedVersion 부 – 기본 테이블에 새 코드 포인트가 추가됨

릴리스된 버전에 대한 버전 번호 정렬:

운영 체제 Release 버전(0xRRMMMMmm)
Windows XP RTM/SP1/SP2/SP3/... 해당 없음 - GetNLSVersion() API 없음
Windows Server 2003 RTM/SP1 0x00 0000 01
Windows Vista RTM/SP1 0x00 0405 00
Windows Server 2008 RTM 0x00 0501 00/ 0x00 5001 00
Windows 7 RTM 0x00060100

 

형상

NLS 버전을 검사 않고 버전 변경 시 다시 인덱싱하지 않는 영구 인덱스가 있는 애플리케이션(예: 데이터베이스)은 올바르게 정렬되지 않거나 요청된 결과를 제공하지 못할 수 있습니다.

사용자 인터페이스의 경우 목록(예: 사전순, 숫자, 영숫자, 기호 등)이 잘못 정렬할 수 있습니다.

해결 방법

애플리케이션은 GetNLSVersionEx (Windows Vista 이상) 또는 GetNLSVersion (Windows Vista 이전)을 호출하여 데이터 정렬 테이블에 대해 정의된 버전과 NLS 버전을 모두 검색할 수 있습니다.

  • GetNLSVersionEx:

이름으로 지정된 로캘에 대해 지정된 NLS 기능의 현재 버전에 대한 정보를 검색합니다.
이 함수를 사용하면 Active Directory와 같은 애플리케이션에서 NLS 변경이 특정 인덱스 테이블에 사용되는 로캘에 영향을 미치는지 여부를 확인할 수 있습니다. 그렇지 않은 경우 테이블을 다시 인덱싱할 필요가 없습니다. 자세한 내용은 로캘 및 언어 정보 처리를 참조하세요.
이 함수는 사용자 지정 로캘을 지원합니다. lpLocaleName이 추가 로캘을 지정하는 경우 검색된 데이터는 해당 추가 로캘과 연결된 데이터 정렬 순서에 대한 올바른 데이터입니다.

참고: Windows Vista 이전의 Windows 버전은 GetNLSVersionEx를 지원하지 않습니다.

  • GetNLSVersion(Windows Vista 이전의 Windows 버전에서 실행되는 애플리케이션에 사용):

식별자가 지정한 로캘에 대해 지정된 NLS 기능의 현재 버전에 대한 정보를 검색합니다.
이 함수를 사용하면 Active Directory와 같은 애플리케이션에서 NLS 변경이 특정 인덱스 테이블에 사용되는 로캘 식별자에 영향을 미치는지 확인할 수 있습니다. 그렇지 않은 경우 테이블을 다시 인덱싱할 필요가 없습니다. 자세한 내용은 로캘 및 언어 정보 처리를 참조하세요.
참고: 이 함수는 식별자가 지정한 로캘에 대한 정보만 검색합니다. GetNLSVersionEx 함수는 추가 로캘, 기능 및 RFC 4646 이름을 지원합니다. 그러나 Windows Vista 이전의 Windows 버전은 GetNLSVersionEx를 지원하지 않습니다.
Windows Vista 이상에서만 실행되도록 의도된 애플리케이션은 이 함수에 대한 기본 설정으로 GetNLSVersionEx 를 사용해야 합니다. GetNLSVersionEx 는 추가 로캘을 잘 지원합니다.

호환성 테스트

데이터 정렬 버전이 변경되었는지를 나타내는 단계(즉, 다시 인덱싱해야 합니다).

  • GetNLSVersionEx()를 사용하여 데이터의 원래 인덱싱을 수행할 때 NLSVERSIONINFOEX 구조를 검색합니다.

  • 버전을 식별하기 위해 인덱스에 다음 속성을 저장합니다. NLSVERSIONINFOEX.dwNLSVersionNLSVERSIONINFOEX.dwDefinedVersion – 이 두 속성은 함께 사용 중인 정렬 테이블의 버전을 지정합니다.
    NLSVERSIONINFOEX.dwEffectiveId - 정렬의 유효 로캘을 지정합니다. 사용자 지정 로캘은 기본 로캘의 정렬을 가리킵니다.

  • 인덱스를 사용하는 경우 GetNlsVersionEx() 를 사용하여 데이터 버전을 검색합니다.

  • 세 가지 속성 중에서 변경된 경우 사용 중인 정렬 데이터가 다른 결과를 반환할 수 있으며 인덱싱이 레코드를 찾지 못할 수 있습니다.

  • 데이터에 잘못된 유니코드 코드 포인트(즉, IsNLSDefinedString()에 대한 호출에서 TRUE를 반환한 모든 문자열)이 포함되어 있지 않은 경우 dwNLSVersiondwDefinedVersion의 하위 바이트만 변경된 경우(위에서 설명한 부 버전) 동일하게 간주할 수 있습니다.