C'è poco che può essere garantito in pratica sui set di caratteri ampi, perché gli standard C e C++ richiedono che tutti i caratteri ampi possano essere rappresentati con un singolo valore di codifica, mentre lo standard nella programmazione Windows è codificato in UTF-16 largo testo. Originariamente il testo di Windows era semplicemente Unicode a 16 bit originale, ora chiamato UCS-2, che è ancora utilizzato nelle finestre di console di Windows e che è conforme ai requisiti C e C++. UTF-16 è un'estensione di UCS-2 che utilizza due valori di codifica, denominati una coppia surrogata, per caratteri al di fuori del piano multilingue multilingue di base di Unicode, a.k.a il BMP.
Re
” E 'vero che i valori integrali di 'x'
e L'x'
devono essere uguali? [Quando x è un membro del set di caratteri di base di origine C++]
Il set di caratteri fonte principale è un sottoinsieme di ASCII, e quasi tutti esistenti codifiche di carattere generale, tra cui in particolare le codifiche Unicode, sono estensioni di ASCII. C'è un'eccezione, vale a dire le codifiche di caratteri EBCDIC di IBM (ci sono più varianti). Tuttavia, se è ancora usato, allora è su mainframe IBM.
Quindi in pratica si ha quella garanzia, ma nel formale non ce l'hai. Ancora più importante, però, è irrilevante. Ad esempio, il set di caratteri di base dell'origine manca del segno $, di cui non ci si può aspettare di fare a meno, vale a dire limitarsi al set di caratteri sorgente di base non è una proposizione pratica.
Re
” E 'vero che std::use_facet<std::ctype<wchar_t>>(std::locale()).widen('x')
dovrebbe essere pari a L'x'
in qualche (o qualsiasi) locale [Se x è un membro del C++ set di caratteri di base di origine]
Per lo stesso motivo per i letterali, sì in pratica, no nel formale (poiché codifiche come EB CDIC sono supportati), e anche questo è irrilevante per il professionista.
In particolare, per l'in-practice, una considerazione più rilevante è che Microsoft Visual C++ ha (non documentato) Windows ANSI come set di caratteri di esecuzione e UTF-16 come codifica di caratteri estesi. Per esempio. sulla mia macchina il set di caratteri di esecuzione è Windows 1252, a.k.a Windows ANSI Western. E alcuni personaggi, in particolare €, hanno codici di caratteri Unicode totalmente differenti. Peggio ancora, potrebbe esserci solo un set di caratteri ristretto che potrebbe essere usato come set di caratteri di esecuzione in cui la codifica UTF-16 di alcuni caratteri userebbe una coppia di valori di codifica surrogati. E in tal caso widen
non può nemmeno rappresentare il risultato; non c'è spazio per questo.
Il compilatore di Microsoft ha Windows ANSI come set di caratteri stretti e Unicode come set di caratteri esteso. Anche se Windows ANSI è Windows ANSI Western i codici non sono gli stessi. Particolarmente fastidioso, l'Euro segno €. –
@ Cheersandhth.-Alf € non è nel set di caratteri sorgente di base, nessun problema qui. –
A seconda della lingua nazionale in cui è installato Windows, € è nel set di caratteri di esecuzione. Ciò include per gli Stati Uniti e la Norvegia. Devi ignorare la documentazione errata che afferma che il set di caratteri di esecuzione è ASCII, perché credendo che finiresti per produrre programmi con risultati errati, e non sarebbe in grado di dare un senso agli avvertimenti del compilatore. ;-) –