2011-08-21 2 views
1

페르시아어 (utf8)에서 문자열을 비교하고 싶습니다. 나는 L "گل"과 같은 것을 사용해야한다는 것을 알고 wchar_t * 또는 wstring에 저장해야합니다. 질문은 내가 compare() 문자열에 의해 비교할 때 나는 올바른 결과를 얻지 못한다.C++에서 페르시아어와 같은 utf8 문자열을 어떻게 비교할 수 있습니까?

+0

C++ 11 (예 : GCC 4.6)이 있습니까? –

+1

평등을 비교하는 것이냐 아니면 소팅의 목적으로 비교하는 것입니까, 아니면 단지 무엇입니까? –

+0

평등에 대한 비교 실제로 – aliakbarian

답변

1

: 텍스트의을 의미 어떤 의미가 있는지 현실적인 비교를하기 전에

일반적으로, 당신은 유니 코드를 정상화 할 필요가 특정 명확한 인코딩은 이미 다음 wchar_t를 사용하지 않고 L"" 리터럴을 사용하지 않는 - 사람들은 유니 코드가 아니라 구현 정의, 불투명 인코딩 only을 위해. 당신의 문자열이 UTF-8에있는 경우

char s의 문자열을 사용합니다. 당신은 원시 유니 코드 코드 포인트 (UCS-4/UTF-32)로 변환 할 경우 이미 그 형태를 가질 경우 현대 컴파일러가있는 경우, 또는, uint32_t의, 또는 char32_t s의 문자열에 저장합니다.

당신이 C++ (11)는, 당신의 문자가 char str8[] = u8"گل"; 또는 char32_t str32[] = U"گل"; 될 수있는 경우. 이것에 대한 자세한 내용은 See this topic을 참조하십시오.

명령 줄 인수 또는 환경과 상호 작용하려면 iconv()을 사용하여 WCHAR에서 UTF-32 또는 UTF-8로 변환하십시오.

3

wchar_t은 UTF-8은 아니지만 (플랫폼)에 따라 일반적으로 하나 UTF-16 또는 UCS-32. UTF-8에서 작업하려면 평범한 이전 char * 또는 string을 사용하고 비교 함수가 동일한 지 확인하십시오. 인간 답게 을 정렬하려면을 사용하면 어떤 인코딩을 사용하든 상관없이 훨씬 더 복잡해집니다.

+0

String.Compare 두 문자열을 작동합니다 및 문자열 wchar 생성자가없는, 그래서 가능성이있는 오류 char 문자로 wchar에서 constrcting, UTF-8로 작업하면 모든 것을 char로 저장할 수 있으며 "보다 큼"과 "미만"이 문제를 일으키는 것을 제외하고는 모든 것이 잘 작동해야합니다. 그러나 당신은 wchar에있는 사람들에게 문제가 있었을 수도 있습니다 ... – Soren

+1

** 모든 유니 코드 인코딩은 UTF-8, 16 또는 32를 포함하여 바이트 - 동등성 이외의 것으로 바이트별로 비교 될 수 없습니다. 디스플레이는 동일하지만 사용 된 바이트 (예 : R-> L 마커, 멀티 코드 점 디스플레이 수정 자 및 페르시아어와 같은 영어 이외의 언어에서 사용되는 유사 문자)는 사용되지 않습니다. –

+0

@ Yann Ramin : 이것이 바로 유니 코드 데이터 정렬 알고리즘이 정규화 및 기본 무시 문자를 처리하는 이유입니다. 나는 종종 적절한 강도 수준을 가진 collator 객체를 얻은 다음 평등 방법을 호출하므로 유니 코드의 균등 불평등 또는 불평등 동등성에 대한 유니 코드의 재미있는 생각을 염려 할 필요가 없습니다. – tchrist

3

유니 코드는 악명 높게 비교하기가 어렵습니다. UTF-8, 16 또는 32을 포함하는 임의의 유니 코드 인코딩은, 바이트 와이즈 바이트 동일성 이외 용 비교할 수없는

참고. 디스플레이는 동일하지만 사용 된 바이트 (예 : R-> L 마커, 서로 게이트 쌍, 디스플레이 수정 자 및 페르시아어와 같은 영어 이외의 언어에서 사용되는 유사 문자)는 사용되지 않습니다. 비교하려는 문자열이있는 경우

http://userguide.icu-project.org/transforms/normalization

+7

_ 텍스트 _는 비교하기가 너무나 어렵습니다.ASCII는 세계의 모든 텍스트의 95 %를 무시함으로써 속임수를 사용합니다. – MSalters

관련 문제