NLS 정렬 변경

영향을 받는 플랫폼

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

기능 영향

심각도 -높음
빈도 -낮음 (영향을 받는 앱은 거의 없으며, 영향을 받는 경우 항상 중단 됨)

Description

NLS (국가별 언어 지원) 함수를 통해 응용 프로그램은 전 세계의 다양 한 언어 및 로캘별 사용자 요구를 지원할 수 있습니다. 새 Windows 버전 거의 항상에는 NLS 변경 내용이 포함 되어 있습니다. 이러한 변경은 데이터 정렬과 정렬에 영향을 주므로 영구적 인덱스가 있는 응용 프로그램에도 영향을 줍니다.

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

주 버전의 경우 비교가 유효 하려면 응용 프로그램이 모든 데이터의 인덱스를 다시 만들어야 하므로 하나 이상의 코드 포인트가 변경 됩니다. 부 버전의 경우 아무 것도 이동 하지 않고 코드 포인트가 추가 됩니다. 이 버전의 경우 응용 프로그램에서는 이전에 정렬 되지 않은 값을 사용 하 여 문자열을 다시 인덱싱합니다. 요약 하자면, 로캘 관련 예외 테이블 및 기본 테이블의 데이터 변경 내용과 관련 하 여 버전 번호는 무엇을 의미 합니다.

Nlsversion Major – ' exception ' 또는 로캘별 테이블에서 변경 된 코드 포인트가 있습니다.
Nlsversion Minor – ' exception ' 또는 로캘별 테이블에 새 코드 포인트가 추가 되었습니다.
DefinedVersion 주요 – 기본 테이블의 변경 된 코드 점수
DefinedVersion Minor – 기본 테이블에 새 코드 포인트가 추가 됨

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

운영 체제 해제 버전 (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와 같은 응용 프로그램이 특정 인덱스 테이블에 사용 되는 로캘 식별자에 영향을 주는지 여부를 결정할 수 있습니다. 그렇지 않으면 테이블의 인덱스를 다시 만들지 않아도 됩니다. 자세한 내용은 로캘 및 언어 정보 처리를 참조 하세요.
참고: 이 함수는 식별자로 지정 된 로캘에 대 한 정보만 검색 합니다. GetNLSVersionEx 함수는 추가 로캘, 기능 및 RFC 4646 이름을 지원 합니다. 그러나 Windows Vista 이전 Windows 버전은 GetNLSVersionEx 를 지원 하지 않습니다.
Windows Vista 이상 에서만 실행 되는 응용 프로그램은이 함수에 GetNLSVersionEx 를 사용 해야 합니다. GetNLSVersionEx 는 보조 로캘에 대 한 적절 한 지원을 제공 합니다.

호환성 테스트

데이터 정렬 버전이 변경 되었는지 여부를 확인 하는 단계 (즉, 인덱스를 다시 만들어야 하는 경우):

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

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

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

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

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