- 这种方法最好是独立于语言环境的。然而,据我所知,排序非常依赖于语言,因此任何适用于英语以外语言的方法都可以,即使这意味着切换语言环境。
- 选项包括使用标准C或C++库或一个小型(适用于嵌入式系统)且非GPL(适用于专有系统)的第三方库。
目前的进展:
strcoll
with C locales andstd::collate
/std::collate_byname
are case-sensitive. (Are there case-insensitive versions of these?)I tried to use a POSIX strcasecmp, but it seems to be not defined for locales other than
"POSIX"
In the POSIX locale, strcasecmp() and strncasecmp() do upper to lower conversions, then a byte comparison. The results are unspecified in other locales.
And, indeed, the result of
strcasecmp
does not change between locales on Linux with GLIBC.#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)); }
This is printed:
strcasecmp('Äaa', 'äaa') == -32 strcoll('Äaa', 'äaa') == -32 strcasecmp('Äaa', 'äaa') == -32 strcoll('Äaa', 'äaa') == 7 strcasecmp('Äaa', 'äaa') == -32 strcoll('Äaa', 'äaa') == 7
P. S.