2010-02-08 7 views
2

대소 문자를 무시하고 두 개의 개별 문자 (char 또는 UTF-16)를 비교하는 좋은 방법은 무엇입니까?두 TCHAR의 대소 문자를 구분하지 않음

사소한 구현은 둘 다 대문자 또는 소문자입니다. 이 중 하나가 더 좋은 것으로 간주되거나 다른 방법이 있습니까?

나는 유니 코드의 모든 세부 사항으로 완전히 정확한 비교가 불가능하다는 것을 알고 있습니다. 이 비교는 설정 파일과 마이크로 문법의 기본 구문 분석에 주로 사용되므로 완벽을 요구하지 않습니다. 나는 문자 단위 비교의 제한하에 잘못하지 않은 구현을 찾고있다.

[편집]
이러한 구성 파일에는 사용자에게 표시되는 텍스트가 포함될 수 있습니다. 또한 사용자 입력을 분석 할 때 유니 코드 텍스트는 피할 수 없습니다.

+0

사용자 입력을 필요로합니까? 그렇다면, 대소 문자를 구별하지 않고 그렇게해야합니까? –

+0

예 - 예 "6kg"과 "6KG"를 모두 허용 할 때. – peterchen

답변

2

당신은 CompareStringEx가 필요합니다. 넓은 문자를 사용하며 대소 문자를 구분하지 않습니다.

+0

"단일 문자 문자열에 넣으시겠습니까?" – peterchen

+0

예. 나는 그것을 의미한다. – bmargulies

0

ASCII 기반의 대소 문자 비 구분 비교를 원할 경우 구성 파일에 유니 코드를 사용하지 마십시오. 이러한 파일에는 ASCII를 사용하십시오. 그렇다면 당신은 로케일에 대해 걱정할 필요가 없습니다.

0

영어 (ASCII) 키워드로 자신을 제한하려는 경우 비교할 수있는 간단한 방법이 있습니다. 이것은 키워드에서 A-Z 이외의 문자를 사용하려는 경우 일반화되지 않지만 A-Z에서는 아름답게 작동합니다.

이 함수에 전달한 값 중 하나가 ASCII 범위 32-127 (AZ, az, 0-9, 대부분의 기호)의 보이는 문자 만 포함 된 알려진 양호한 키워드 문자열 일 것입니다. 낮은 대문자로 변환하기 위해 간단한 비트 마스킹을 수행합니다.

bool IsKeywordMatch(LPCTSTR psz, LPCTSTR pszKey) 
{ 
    while (pszKey[0]) 
    { 
     if (psz[0] < 0x20) 
      return false; 

     if ((psz[0] & ~0x20) != (pszKey[0] & ~0x20)) 
     return false; 

     ++psz; 
     ++pszKey; 
    } 
    return true; 
} 

이 코드가 입력 문자열에 알려진 좋은 키워드를 비교 전문, 하지 범용 문자열 비교입니다. {}를 대문자로 대문자로 대문자로 처리하지만,이 함수에 대한 입력 중 하나에 이러한 문자가 하나도 포함되어 있지 않다면 문제가되지 않습니다.

는 '(문자열로 변환 예를 들어, 두 개의 TCHARs의 배열을 첫 번째로 TCHAR를 복사 _T에 두 번째 설정이

if (IsKeywordMatch(pszInput, "value")) 
1

처음처럼 사용할 수하기위한 것입니다 \ 0 '). 그런 다음 lstrcmpi 또는 CompareString을 호출하십시오. 이 두 가지 모두 필요에 따라 충분하지 않을 수도 있지만 좋은 시작입니다. 예를 들어, ß를 대문자로 바꾸고 싶거나 사용자가 터키어를 사용하고 있고 i를 업 그레 이드하려는 경우, 직접 해보는 것이 생각보다 어렵습니다.

관련 문제