2012-08-30 10 views
12

ho trovato il livello C (C99 e C11) vago rispetto alle posizioni del codice carattere/stringa e regole di codifica:standard C: Set Caratteri e codifica stringa di specifica

Innanzitutto lo standard definisce the source character set e the execution character set. In sostanza fornisce un insieme di glifi, ma non associa alcun valore numerico con essi - Quindi qual è il set di caratteri predefinito?

Non sto chiedendo di codificare qui ma solo il glifo/repertorio per la mappatura numerica/di codice. Definisce universal character names come ISO/IEC 10646, ma dice che questo è il set di caratteri predefinito?

Come estensione a quanto sopra - Non ho trovato nulla che dica quali caratteri rappresentino le sequenze di escape numeriche \ 0 e \ x.

dagli standard C (C99 e C11, non ho controllato ANSI C) ho ottenuto il seguente circa il carattere e stringhe letterali:

+---------+-----+------------+----------------------------------------------+ 
| Literal | Std | Type  | Meaning          | 
+---------+-----+------------+----------------------------------------------+ 
| '...' | C99 | int  | An integer character constant is a sequence | 
|   |  |   | of one or more multibyte characters   | 
| L'...' | C99 | wchar_t | A wide character constant is a sequence of | 
|   |  |   | one or more multibyte characters    | 
| u'...' | C11 | char16_t | A wide character constant is a sequence of | 
|   |  |   | one or more multibyte characters    | 
| U'...' | C11 | char32_t | A wide character constant is a sequence of | 
|   |  |   | one or more multibyte characters    | 
| "..." | C99 | char[]  | A character string literal is a sequence of | 
|   |  |   | zero or more multibyte characters   | 
| L"..." | C99 | wchar_t[] | A wide string literal is a sequence of zero | 
|   |  |   | or more multibyte characters     | 
| u8"..." | C11 | char[]  | A UTF-8 string literal is a sequence of zero | 
|   |  |   | or more multibyte characters     | 
| u"..." | C11 | char16_t[] | A wide string literal is a sequence of zero | 
|   |  |   | or more multibyte characters     | 
| U"..." | C11 | char32_t[] | A wide string literal is a sequence of zero | 
|   |  |   | or more multibyte characters     | 
+---------+-----+------------+----------------------------------------------+ 

Comunque io non ho trovato nulla circa la codifica regole per questi letterali. UTF-8 sembra suggerire la codifica UTF-8, ma non penso sia menzionato esplicitamente ovunque. Inoltre, per gli altri tipi la codifica non è definita o dipende dall'implementazione?

Non ho familiarità con le specifiche UNIX. La specifica UNIX specifica eventuali vincoli aggiuntivi a queste regole?

Anche se qualcuno può dirmi cosa schema charset/codifica utilizzato dal GCC e MSVC che sarebbe anche aiutare.

risposta

5

C non è avido di set di caratteri. Non esiste un "set di caratteri di default", è definito dall'implementazione - sebbene sia per lo più ASCII o UTF-8 sulla maggior parte dei sistemi moderni.

+0

E 'anche definita l'implementazione per u8 "..." letterali? Sembra suggerire la codifica UTF-8 per quel particolare letterale. – tinkerbeast

+0

@tinkerbeast no - C non richiede alcun set di caratteri particolare. U8" ..."indica che la stringa deve essere composta da caratteri che si inseriscono in una memoria a otto bit. –

+0

@ H2CO3 C11 dice che u8 letterali sono utf-8. Non sono sicuro che i compilatori siano riusciti a implementarlo nonostante – nos

4

Lo standard non specifica una codifica predefinita perché la pratica esistente aveva già implementato C su macchine con molte codifiche diverse, ad esempio mainframe Honeywell e mainframe IBM.

Mi aspetto che gcc prenda il valore predefinito dalla locale attualmente specificata da LC_CHARSET, ma non l'ho mai testato.

VC++ prende il valore predefinito da un'impostazione del Pannello di controllo. L'impostazione predefinita del Pannello di controllo varia a seconda del paese in cui è stato acquistato Windows e la maggior parte degli utenti non la modifica, ma è possibile cambiarla durante l'installazione di Windows in seguito.

I trigrammi sono stati inventati in modo che un programma di origine possa essere copiato da un ambiente con una locale in un ambiente con un locale leggermente diverso e ancora compilato. Ad esempio, se un utente di Windows in Cina utilizza i trigrafi, un utente di Windows in Grecia potrebbe compilare lo stesso programma di origine. Tuttavia, se le impostazioni locali sono troppo diverse, ad esempio una con EBCDIC e una con EUC, i trigraph non saranno sufficienti.

+0

BTW, hai qualche idea del perché i trigrafi sono stati scelti per essere così brutti, per questo perché operano all'interno di una stringa e caratteri letterali? La mia teoria, guardando i codici, è che sono stati scelti da una persona passiva-aggressiva che non li voleva in primo luogo. Penserei che avrebbe dovuto essere perfettamente sufficiente a fornire che se una linea inizia con '#define __BACKSLASH_DESIGNATOR', qualsiasi apparenza del personaggio o della sequenza che segue (che deve contenere almeno un carattere al di fuori del set C standard) verrebbe considerata come una barra rovesciata, altri char potrebbero quindi utilizzare i digrammi di backslash . – supercat

+1

@supercat: [Questa pagina] (http://www.lysator.liu.se/c/rat/b.html#2-2-1-1) spiega lo scopo dei trigrafi. Risale a quando lo standard ANSI C era ancora una bozza e fa parte di un documento che contiene le motivazioni per molte delle decisioni prese in tale standard. –

+0

@PeterO .: Grazie per quello. Mi trovo ancora curioso di sapere se i set di caratteri che sono stati usati non avessero un backslash * e * non avessero un carattere non ASCII che potrebbe essere dichiarato avere lo stesso effetto? Quando stavo programmando PL/I, i terminali erano tutti ASCII e non avevano un carattere '¬' richiesto per PL/I, ma poiché PL/I non usava'^', la traduzione da ASCII a EBCDIC semplicemente convertito ASCII '^' in EBCDIC '¬'. Mi chiedo se lo stesso approccio avrebbe potuto funzionare con C - dichiarare che ogni implementazione deve designare un carattere di "escape" (che sarebbe '\' per ASCII), e ... – supercat