Precedente: , Su: Tipi di variabile e confronti   [Contenuti][Indice]


6.3.2.3 Confronto tra stringhe usando l’ordine di collazione locale

Lo standard POSIX diceva che il confronto di stringhe viene effettuato secondo l’ordine di collazione locale. Questo è l’ordine secondo il quale sono disposti i caratteri, come definito dalla localizzazione (per una trattazione più dettagliata, vedi la sezione Il luogo fa la differenza). Quest’ordine normalmente è molto diverso dal risultato ottenuto quando si esegue un confronto rigorosamente "carattere per carattere".35

Poiché questo comportamento differisce sensibilmente dalla pratica corrente, gawk lo implementava solo quando eseguito in modalità POSIX (vedi la sezione Opzioni sulla riga di comando). Quest’esempio ilustra la differenza, in una localizzazione en_US.UTF-8:

$ gawk 'BEGIN { printf("ABC < abc = %s\n",
>                     ("ABC" < "abc" ? "TRUE" : "FALSE")) }'
-| ABC < abc = TRUE
$ gawk --posix 'BEGIN { printf("ABC < abc = %s\n",
>                             ("ABC" < "abc" ? "TRUE" : "FALSE")) }'
-| ABC < abc = FALSE

Fortunatamente, dal mese di agosto 2016, un confronto basato sull’ordine di collazione locale non è più richiesto per gli operatori == e !=.36 Tuttavia, un confronto basato sull’ordine di collazione locale è ancora richiesto per gli operatori <, <=, > e >=. POSIX, quindi, raccomanda quanto segue:

Poiché l’operatore == controlla che se le stringhe sono identiche, e non se sono nell’ordine di collazione locale, le applicazioni che devono controllare se le stringhe sono nell’ordine di collazione locale possono usare:

a <= b && a >= b

A partire dalla versione 4.2, gawk continua a usare l’ordine di collazione locale per <, <=, > e >= solo se eseguito nella modalità POSIX.


Note a piè di pagina

(35)

Tecnicamente, il confronto di stringhe dovrebbe funzionare come se le stringhe fossero confrontate usando la funzione strcoll() di C.

(36)

Si consulti il sito web dell’Austin Group.


Precedente: , Su: Tipi di variabile e confronti   [Contenuti][Indice]