2015-08-12 14 views
18

Qual è esattamente il punto di questi come proposto da N4267?Qual è il punto dei caratteri letterali UTF-8 proposti per C++ 17?

La loro unica funzione sembra essere quella di impedire che caratteri ASCII estesi o punti di codice UTF-8 parziali vengano specificati. Conservano ancora in un char a 8 bit a larghezza fissa (che, a quanto ho capito, è il modo migliore e migliore per gestire UTF-8 comunque per quasi tutti i casi d'uso), quindi non supportano caratteri non-ASCII tutti. Cosa sta succedendo?

(In realtà io non sono del tutto sicuro di aver capito la necessità di UTF-8 stringhe letterali sia. Credo che sia la preoccupazione di compilatori che fanno cose strane/ambigue con le stringhe Unicode accoppiato con la convalida del Unicode?)

+3

Forse [questo è utile ] (http://stackoverflow.com/a/30872695/1708801) –

+0

Ah, grazie mille per questo collegamento, ho trovato quella domanda ma chiaramente non ho fatto scorrere abbastanza verso il basso! Questo ha senso, quindi fondamentalmente è solo per garantire che un personaggio sia ASCII? È un nome piuttosto scadente, in tal caso, devo dire! Sembra una caratteristica per coincidenza piuttosto che per design ... – Muzer

+0

Spesso non trovo la risposta che cerco nella risposta accettata e spesso devo andare al centro delle risposte per trovarla. Questo può essere per molte ragioni, spesso le buone risposte arrivano tardi o forse mesi o anni dopo, in alcuni casi. –

risposta

15

la logica è coperto in dal Evolution Working Group issue 119: N4197 Adding u8 character literals, [tiny] Why no u8 character literals? che ha seguito la proposta e dice:

Abbiamo cinque codifica-prefissi per stringa-letterali (nessuno, L, U8, U, U) ma solo quattro per i letterali di carattere - quello mancante è u8 per i caratteri letterali .

Questo è importante per le implementazioni in cui il carattere di esecuzione stretto impostato non è ASCII. In tal caso, i caratteri letterali di u8 fornirebbero un modo ideale per scrivere caratteri letterali con codifica ASCII garantita (le codifiche u8 a codice singolo sono esattamente ASCII), ma ... non li forniamo. Invece, il meglio che si può fare è qualcosa di simile:

char x_ascii = { u'x' }; 

... dove otterremo un errore di restringimento se il codepoint non entra nella un 'char'. (Si noti che questa non è proprio la stessa di u8'x', che sarebbe ci danno un errore se il codepoint non era rappresentabile come una singola unità codice in UTF-8.)

+3

Forse dovresti anche dire che se l'u8 richiede parecchi byte è mal formato (secondo il tuo link nel commento). Penso che sia il più grande vantaggio, perché oggigiorno scrivere qualcosa come 'if (c == 'ç')' sembra funzionare ma potrebbe in effetti non fornire il risultato previsto (o perché codifica errata del file sorgente, o perché solo la prima byte è usato, mentre u8'ç 'genera un errore mostrando che c'è un problema reale qui – Christophe

+0

@Christophe buon punto, risposta aggiornata per includere anche quella parte. –

+2

Cheers, questa è chiaramente la risposta corretta. Ci tengo molto a questo, perché sembra molto controintuitivo avere un prefisso che significa "UTF-8" che in realtà accetta solo ASCII, ma suppongo sia meglio delle alternative. – Muzer