2009-10-24 2 views
1

어제 비슷한 질문을했지만 다른 방식으로 리 페이즈해야한다는 것을 알고 있습니다.Windows에서 C++의 유니 코드에서 대/소문자를 구분하지 않는 검색

짧게 : Windows의 C++에서 문자열이 유니 코드 형식 (와이드 char, wchar_t) 일 때 대/소문자를 구분하지 않고 문자열을 검색하려면 어떻게해야합니까? 문자열의 언어 나는 건초 더미에 바늘이 있는지 여부를 알고 싶습니다. 바늘의 위치는 나와 관련이 없습니다.

배경 : 이메일 본문이 많은 저장소가 있습니다. 메시지는 다른 언어 (일본어, 독일어, 러시아어, 핀란드어로되어 있습니다)에 있습니다. 모든 데이터는 유니 코드 형식이며, C++ 응용 프로그램에서 와이드 문자열 (wchar_t)에로드합니다 (시체는 MIME 디코딩되어 있으므로 디버거에서는 실제 일본어, 독일어 문자를 볼 수 있음). 전자 메일 메시지에는 세부 정보가 포함되어 있지 않으므로 메시지의 언어를 모릅니다. 또한 단일 전자 메일 본문에는 여러 언어의 문자가 포함될 수 있습니다.

나는 wcsstr과 같은 것을 찾고 있지만, insensitve 방식으로 검색을 수행 할 수있는 능력이 있습니다. 나는 텍스트의 언어를 모른 채 대문자에서 소문자로 100 % 적절한 변환을 할 수 없다는 것을 알고있다. 나는 가능한 99 %의 경우에 작동하는 솔루션을 원합니다.

Visual Studio 2008과 C++, STL 및 Boost를 함께 사용하고 있습니다.

+1

Iiİı 문제가 증명할 때 이상을 무시하고 싶습니다. 당신은 실제로 정확하지 않은 일치를 원한다. 예를 들어 é = e를 원한다. 그리고 æ = ae, 그래서 당신은 문자 단위로 이것을 할 수 없습니다. – MSalters

답변

1

부스트 문자열 알고리즘은 사용자가 필요로하는 기능 템플릿 icontains()을 가지고 있습니다.

+0

그래서 유니 코드 문자열로 작동합니까? – Nitramk

+0

wchar_t * 및 std :: wstring 형식 또는 std :: basic_string <>에서 파생 된 형식 모두에서 작동합니다. – Ferruccio

+0

그러나 일반적으로 유니 코드에서는 작동하지 않습니다. "ß"와 "SS"는 동등한 값을 비교해야하지만 Boost String Algorithms는이를 처리하지 않습니다. – dalle

0

대/소문자를 구분하지 않는 일치를 위해 유니 코드 규칙을 따르는 유니 코드 정규식을 지원하는 ICU library을 사용해야합니다. 라이브러리는 C/C++ 및 Java 라이브러리로 사용할 수 있습니다. Python과 같은 다른 많은 언어는 ICU 라이브러리에 대한 래퍼를 지원합니다.

+0

이렇게하기 위해 새 큰 라이브러리를 번들로 묶고 싶지는 않습니다. Boost 또는 Windows API에서 사용할 수있는 솔루션을 찾고 있습니다. – Nitramk

+0

확인하려면 http://download.icu-project.org/files/icu4c/4.2.1/icu4c-4_2_1-Win32-msvc9.zip을 다운로드하고 .lib 파일은 약 200K까지 더하고 DLL은 ~ 약 20M. 이 시대에는 많은 것이 아니기 때문에 실제로하고있는 일을 위해 모든 것을 필요로하지 않을 수도 있습니다. 어쨌든 ICU는 유니 코드를 만드는 올바른 방법입니다. –

+0

내가하려는 일의 범위를 고려할 때, ICU가 해결하는 Ferruccios 솔루션에는 어떤 문제가 있습니까? – Nitramk

0

바늘과 건초 더미를 모두 소문자 (대문자)로 변환 한 다음 wcsstr()을 수행 할 수 있습니다.

4

대소 문자를 구분하지 않고 비교할 언어를 지정해야합니다. 예를 들어, 터키어에서 'i'는 'I'에 해당하는 소문자가 아닙니다. 언어가 지정되지 않은 것으로 나타나면 암시 적으로 선택된 언어로 비교가 수행됩니다.

+0

이번에는 제 질문이 너무 길었습니다. 내 질문에 지적했듯이, 100 % 제대로 수행 할 수있는 언어를 알아야한다는 것을 잘 알고 있습니다. 그러나 기술적으로 불가능하기 때문에 99 %의 시간 동안 해결할 솔루션을 요구하고 있습니다. – Nitramk

+0

찾고있는 문자열의 원본은 무엇입니까? 사용자가 제공 한 경우 사용자의 로켈이 적합 할 수 있습니다. 또한 질문에서 대소 문자를 구분하지 않는 검색이 필요한 이유를 설명하지 못합니다. –

관련 문제