Bash kılavuzu söyler:
kullanıldığında [[< ve> operatörler Mevcut yerel ayarı kullanarak sözcüksel olarak rt. Test komutu ASCII sıralamasını kullanarak sıralar.
Bu, (3), sırasıyla strcoll (3) ya da strcmp kullanılarak kaynar.
Bunu test için aşağıdaki programı (strcoll_strcmp.c) kullanın:
#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;
}
Not farkı: bu gibi karşılaştırmak neden
$ 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
Tam emin değilim. Bu, bazı ingilizce sözlük kurallarına bağlı olmalıdır. Kesin kuralların
ISO 14651 Method for comparing character strings and description of the common template tailorable ordering ve beraberindeki şablon tablosunda açıklandığını düşünüyorum. Glibc bu verileri, kaynak ağacında
libc/localedata/locales
'un altında içerir.
Ama neden tek uzay 'a' her iki durumda da daha azdır? – updogliu
cevabım altındaki bir ekleme Bkz @updogliu. – spbnick
Birkaç durum denedim. Lider boşlukların bulunması yeterlidir strcoll' 'de atılır gibi görünüyor. //en.cppreference.com/w/cpp/string/byte/strcoll – updogliu