Dove posso trovare una tabella di tutti i personaggi per ogni set di caratteri C99?

Sto cercando un tavolo (o un modo per generarne uno) per ogni personaggio in ciascuno dei seguenti set di caratteri C:

  • Set di caratteri di base
  • Set di caratteri dell’esecuzione di base
  • Set di caratteri sorgente di base
  • Set di caratteri di esecuzione
  • Set di caratteri estesi
  • Set di caratteri di origine

C99 menziona tutti e sei di questi sotto la sezione 5.2.1 . Tuttavia, ho trovato estremamente criptico leggere e privo di dettagli.

Gli unici set di caratteri che definisce chiaramente sono il set di caratteri dell’esecuzione di base e il set di caratteri di origine di base :

52 lettere maiuscole e minuscole nell’alfabeto latino:

ABCDEFGHIJKLMNOPQRSTU VWXYZ

    abcdefghijklmnopqrstu vwxyz

    Dieci cifre decimali:

    0 1 2 3 4 5 6 7 8 9

    29 caratteri grafici:

    ! “#% & ‘() * +, -. /:; ? [\] ^ _ {|} ~

    4 caratteri di spaziatura:

    spazio, scheda orizzontale, scheda verticale, avanzamento modulo

    Credo che questi siano gli stessi del Set di caratteri di base , anche se suppongo che C99 non lo dichiari esplicitamente. I rimanenti set di caratteri sono un po ‘un mistero per me.

    Grazie per l’aiuto che puoi offrire! 🙂

    Ad eccezione del set di caratteri di base, come menzionato, tutti gli altri set di caratteri sono definiti dall’implementazione . Ciò significa che potrebbero essere qualsiasi cosa, ma l’ implementazione (ovvero l’ implementazione del compilatore C / librerie / toolchain) deve documentare tali decisioni. I paragrafi chiave qui sono:

    §3.4.1 Comportamento definito dall’implementazione
    comportamento non specificato in cui ogni implementazione documenta come viene effettuata la scelta

    §3.4.2 Comportamento specifico della locale
    comportamento che dipende dalle convenzioni locali di nazionalità, cultura e lingua che ogni documento di attuazione

    §5.2.1.1 Set di caratteri
    Devono essere definiti due gruppi di caratteri e le relative sequenze di fascicolazione associate: il set in cui vengono scritti i file di origine (il set di caratteri di origine ) e il set interpretato nell’ambiente di esecuzione (il set di caratteri di esecuzione ). Ogni insieme è ulteriormente diviso in un set di caratteri di base , il cui contenuto è dato da questo sottopunto e un insieme di zero o più membri specifici per locale (che non sono membri del set di caratteri di base) chiamati caratteri estesi . Il set combinato è anche chiamato set di caratteri estesi . I valori dei membri del set di caratteri di esecuzione sono definiti dall’implementazione .

    Quindi, guarda la documentazione del tuo compilatore C per scoprire quali sono gli altri set di caratteri. Ad esempio, nella mia pagina man per gcc, alcune delle opzioni della riga di comando indicano:

        -fexec-charset = charset
            Imposta il set di caratteri di esecuzione, usato per stringa e carattere
            costanti.  L'impostazione predefinita è UTF-8.  charset può essere qualsiasi codifica
            supportato dalla routine di libreria "iconv" del sistema.
    
        -fwide-exec-charset = charset
            Imposta il set di caratteri di esecuzione ampia, utilizzato per stringa ampia e
            costanti di carattere.  L'impostazione predefinita è UTF-32 o UTF-16, qualunque sia
            corrisponde alla larghezza di "wchar_t".  Come con -fexec-charset,
            charset può essere qualsiasi codifica supportata dal "iconv" del sistema
            routine di libreria;  tuttavia, avrai problemi con le codifiche
            che non si adattano esattamente a "wchar_t".
    
        -finput-charset = charset
            Imposta il set di caratteri di input, utilizzato per la traduzione da
            set di caratteri del file di input per il set di caratteri sorgente utilizzato da
            GCC.  Se la locale non specifica, o GCC non può ottenere questo
            informazioni dalla locale, il valore predefinito è UTF-8.  Questo può essere
            sovrascritto dalle impostazioni internazionali o da questa opzione della riga di comando.
            Attualmente l'opzione della riga di comando ha la precedenza se c'è un
            conflitto.  charset può essere qualsiasi codifica supportata dal sistema
            routine di libreria "iconv".
    

    Per ottenere un elenco delle codifiche supportate da iconv , esegui iconv -l . Il mio sistema ha 143 diverse codifiche tra cui scegliere.

    Per quanto vedo, lo standard non parla di un set di caratteri di base come qualcosa di distinto dal set di caratteri sorgente e dal set di caratteri di esecuzione. Lo standard stabilisce che ci sono 2 set di caratteri per i quali è interessato – il set di caratteri sorgente e il set di caratteri di esecuzione. ognuno di questi ha un componente ‘base’ e ‘esteso’ (e il componente esteso di entrambi può essere il set vuoto).

    Si dispone di un “set di caratteri di origine” costituito da un “set di caratteri di origine di base” e da zero o più “caratteri estesi”. La combinazione del set di caratteri sorgente di base e di quei caratteri estesi è chiamata set di caratteri sorgente esteso.

    Analogamente per il set di caratteri di esecuzione (esiste un set di caratteri di esecuzione di base che combinato con zero o più caratteri estesi compongono i caratteri di esecuzione estesa impostati).

    Lo standard (e la tua domanda) enumerano i caratteri che devono essere nel set di caratteri di base – ci possono essere altri caratteri nel set di base.

    Per quanto riguarda la differenza tra “intervallo” di base e “intervallo” esteso di ciascun set di caratteri, i valori dei membri del set di caratteri di base devono rientrare in un byte – quella restrizione non vale per i caratteri estesi. Si noti inoltre che ciò non significa necessariamente che la codifica del file di origine debba essere una codifica a byte singolo.

    I valori dei caratteri nei set di caratteri di origine non devono necessariamente concordare con i valori nei set di caratteri di esecuzione (ad esempio, il set di caratteri di origine potrebbe essere costituito da ASCII, mentre il set di caratteri di esecuzione potrebbe essere EBCDIC).

    Potresti dare un’occhiata a GNU iconv . Tra molti altri, stamperà o convertirà entrambe le stringhe Java e C99. iconv è un’interfaccia a riga di comando per libiconv che, molto probabilmente, è ciò che il compilatore C99 sta usando internamente per queste conversioni di caratteri.

    Digita iconv -l per vedere quali stringhe sono disponibili sul tuo sistema. Dovrai ricompilare dal sorgente per cambiare quel set.

    Su OS X, ho 141 set di caratteri. Su Ubuntu, ho 1.168 set di caratteri (con la maggior parte di questi alias).