Bash instrukcja mówi:
przypadku korzystania z [[The < i> operatorzy tak rt leksykograficznie za pomocą bieżącego locale. Polecenie testowe sortuje przy użyciu uporządkowania ASCII.
Sprowadza się to do używania odpowiednio strcoll (3) lub strcmp (3).
Użyj następującego programu (strcoll_strcmp.c), aby przetestować to:
#include <stdio.h>
#include <string.h>
#include <locale.h>
int main(int argc, char **argv)
{
setlocale(LC_ALL, "");
if (argc != 3) {
fprintf(stderr, "Usage: %s str1 str2\n", argv[0]);
return 1;
}
printf("strcoll('%s', '%s'): %d\n",
argv[1], argv[2], strcoll(argv[1], argv[2]));
printf("strcmp('%s', '%s'): %d\n",
argv[1], argv[2], strcmp(argv[1], argv[2]));
return 0;
}
zauważyć różnicę:
$ LC_ALL=C ./strcoll_strcmp ' a' '0a'
strcoll(' a', '0a'): -16
strcmp(' a', '0a'): -16
$ LC_ALL=en_US.UTF-8 ./strcoll_strcmp ' a' '0a'
strcoll(' a', '0a'): 10
strcmp(' a', '0a'): -16
dokładnie, dlaczego to porównanie jako taki nie jestem pewien. Musi to być spowodowane niektórymi angielskimi zasadami sortowania leksykograficznego. Myślę, że dokładne zasady są opisane w ISO 14651 Method for comparing character strings and description of the common template tailorable ordering i dołączonej tabeli szablonów. Glibc zawiera te dane w drzewie źródłowym pod numerem libc/localedata/locales
.
Ale dlaczego jedna przestrzeń jest mniejsza niż 'a' w obu przypadkach? – updogliu
@updogliu Zobacz dodatek na dole mojej odpowiedzi. – spbnick
Próbowałem kilku przypadków. Wygląda na to, że wiodące białe spacje są po prostu odrzucane w 'strcoll'. – updogliu