C++에서 UTF-8 문자열을 비교하고 정렬하는 방법을 찾고 있는데, 대/소문자를 구분하지 않고 custom collation function in SQLite에서 사용합니다.SQLite (C/C++)에 대/소문자를 구분하지 않는 UTF-8 문자열 데이터 정렬
- 이상적으로은 로캘과 무관해야합니다. 그러나 나는 숨을 멈추지 않을 것입니다. 내가 아는 한 데이터 정렬은 언어에 매우 의존적입니다. 따라서 로케일 전환을 의미한다고해도 영어가 아닌 다른 언어에서도 작동하는 것은 무엇이든 할 것입니다.
- 표준 C 또는 C++ 라이브러리 또는 (임베디드 시스템에 적합) 및 비 GPL (독점 시스템에 적합) 타사 라이브러리를 사용하는 옵션이 있습니다. 내가 지금까지 무엇을 가지고
: C 로케일과
strcoll
및std::collate
/std::collate_byname
은 대소 문자를 구분합니다.은 내가 POSIX의 strcasecmp를 사용하려고 (이들의 대소 문자를 구별하지 버전은? 있는가),하지만
"POSIX"
는 POSIX 로케일에서, strcasecmp 이외의 로케일에 대한 not defined 것 같다()와 strncasecmp()는 변환을 위 아래로 수행 한 다음 바이트 비교를 수행합니다. 다른 로캘에서는 결과가 지정되지 않습니다.
그리고, 참으로,
strcasecmp
의 결과는 GLIBC 리눅스에 로케일 사이에 변경되지 않습니다.strcasecmp('Äaa', 'äaa') == -32 strcoll('Äaa', 'äaa') == -32 strcasecmp('Äaa', 'äaa') == -32 strcoll('Äaa', 'äaa') == 7 strcasecmp('Äaa', 'äaa') == -32 strcoll('Äaa', 'äaa') == 7
PS
을 그리고 네, 나는 ICU에 대해 알고 있지만, 우리는 인해 enormous size에 임베디드 플랫폼에서 사용할 수 없습니다 :#include <clocale>
#include <cstdio>
#include <cassert>
#include <cstring>
const static char *s1 = "Äaa";
const static char *s2 = "äaa";
int main() {
printf("strcasecmp('%s', '%s') == %d\n", s1, s2, strcasecmp(s1, s2));
printf("strcoll('%s', '%s') == %d\n", s1, s2, strcoll(s1, s2));
assert(setlocale(LC_ALL, "en_AU.UTF-8"));
printf("strcasecmp('%s', '%s') == %d\n", s1, s2, strcasecmp(s1, s2));
printf("strcoll('%s', '%s') == %d\n", s1, s2, strcoll(s1, s2));
assert(setlocale(LC_ALL, "fi_FI.UTF-8"));
printf("strcasecmp('%s', '%s') == %d\n", s1, s2, strcasecmp(s1, s2));
printf("strcoll('%s', '%s') == %d\n", s1, s2, strcoll(s1, s2));
}
이 인쇄됩니다 .
: 이들은 "해결"또는 기타 UTF-8 또는 더 전에 수천 번 처리되지해야합니다. MS Word에는 항상 "토글 케이스"기능이 있습니다. 유니 코드 이전 버전에서는 어떻게 작동합니까? WordPerfect는 어떻게 운영 되었습니까? 델파이에서 일하는 것을 제외하면 OP와 동일한 문제가 발생합니다. 영어, 독일어 또는 (내 경우에는) 폴란드어 로켈에 설치되어 있는지 여부에 관계없이 대/소문자를 구분하지 않는 SELECT (및 ORDER BY)를 수행하는 여러 Windows sqlite 기반 응용 프로그램을 보았습니다. 파이어 폭스를 시도해보십시오 :) 어떻게 그 일을합니까? –
보통 부정확하다 : 폴란드 인에는 IIRC가 단단한 케이스가 없다; 폴란드어로 사용 된 모든 비 ASCII 문자는 ASCII 문자를 기반으로합니다. – MSalters
터키어 I 문제를 제외하고는 유니 코드 케이스 접기 알고리즘 (http://www.unicode.org/reports/tr44/)이 매우 잘 작동합니다. – dalle