`Utf8` in` en_US.utf8` è un set di caratteri canonici?

Aug 23 2020

L'output di localesembra distinguere tra maiuscolo e minuscolo:

% locale -a 
C
en_AU.utf8
en_US.utf8
POSIX

Più comunemente, ho visto il trattino e il maiuscolo UTF-8.

Qual è il nome canonico di utf8 / UTF-8?

Risposte

3 TomHale Aug 22 2020 at 23:43

TL; DR: No.

  • utf8non si riferisce a un set di caratteri IANA poiché elimina il -carattere.
  • Caratteri IANA nomi indicati sono case IN sensibili.
  • Pertanto, quanto segue si riferisce a RFC3629: UTF-8, un formato di trasformazione di ISO 10646 :
    • UTF-8
    • utf-8
    • uTf-8 (Nota che tutti hanno un trattino)
  • Esiste un alias con distinzione tra maiuscole e minuscole del nome precedente :csUTF8

I dettagli

POSIX.1-2017, sezione 8.2 Variabili di internazionalizzazione

Se il valore della locale ha la forma:

language[_territory][.codeset]

si riferisce a una locale fornita dall'implementazione, dove le impostazioni di lingua, territorio e set di codici sono definite dall'implementazione.

Ma mentre POSIX.1 lascia l'implementazione dei dettagli definita, IANA ha qualcosa da dire al riguardo.

RFC2978 Procedure di registrazione set di caratteri IANA

2.3. I requisiti di denominazione definiscono un nome principale del set di caratteri:

 mime-charset = 1*mime-charset-chars
 mime-charset-chars = ALPHA / DIGIT /
            "!" / "#" / "$" / "%" / "&" /
            "'" / "+" / "-" / "^" / "_" /
            "`" / "{" / "}" / "~"
 ALPHA        = "A".."Z"    ; Case insensitive ASCII Letter
 DIGIT        = "0".."9"    ; Numeric digit

Nota il Case insensitive ASCII Letter.

È interessante notare che questo significa che ^-^è un nome di set di caratteri felice ma valido.

Set di caratteri IANA

Questi sono i nomi ufficiali per i set di caratteri che possono essere utilizzati in Internet e possono essere indicati nella documentazione di Internet.

I nomi dei set di caratteri possono contenere fino a 40 caratteri presi dai caratteri stampabili di US-ASCII. Tuttavia, non viene fatta alcuna distinzione tra l'uso di lettere maiuscole e minuscole . [enfasi mia]

IANA elenca il set di caratteri come UTF-8.

Mentre utf-8(o uTf-8) è un nome ufficiale per un nome di set di caratteri IANA, utf8(senza trattino) non è un nome di set di caratteri IANA.

Nota che c'è anche un! Case-sensitive! alias per il nome UTF-8, e cioè: csUTF8.

La "cs" sta per set di caratteri e viene fornita per le applicazioni che richiedono una prima lettera minuscola ma che in seguito desiderano utilizzare lettere maiuscole e minuscole che non possono contenere caratteri speciali, come la barra inferiore ("_") e il trattino ("-").

Se non è IANA, da dove viene utf8probabilmente?

Glibc_nl_normalize_codeset() fa quanto segue:

  • Passa solo caratteri o cifre (trattino addio)

  • Converte i caratteri in minuscolo

    for (cnt = 0; cnt < name_len; ++cnt)
      if (__isalpha_l ((unsigned char) codeset[cnt], locale))
        *wp++ = __tolower_l ((unsigned char) codeset[cnt], locale);
      else if (__isdigit_l ((unsigned char) codeset[cnt], locale))
        *wp++ = codeset[cnt];
    

Il commento sul codice dice erroneamente:

Non esiste uno standard per i nomi dei set di codici.

Questo commento non sembra consapevole delle procedure di registrazione dei set di caratteri IANA RFC2978, 2.3. Requisiti di denominazione .