W jaki sposób kompilator musi interpretować plik UTF-8 zawierający znaki spoza ASCII w nowych typach literałów łańcuchowych. Rozumiem, że standard nie określa kodowania plików, a sam ten fakt spowodowałby, że interpretacja znaków spoza ASCII w kodzie źródłowym byłaaby całkowicie niezdefiniowana, co czyni tę funkcję mniej przydatną.
Od n3290, 2,2 Fazy tłumaczeniu [lex.phases]
znaków pliku źródłowego fizyczne są odwzorowane, w realizacji zdefiniowanej sposób do podstawowego źródła zestaw znaków (wprowadzenie wczesne wykrywanie chorób znaki linii dla wskaźników końca wiersza), jeśli konieczne jest: .Zbiór zaakceptowanych fizycznych znaków pliku źródłowego to zdefiniowany przez implementację. [Tutaj jest trochę o trigrafach.] Dowolny plik źródłowy o numerze , który nie znajduje się w podstawowym źródłowym zestawie znaków (2.3), jest zastępowany przez nazwę uniwersalnego znaku, który oznacza tę postać. (Implementacja może korzystać z dowolnego wewnętrznego kodowania, o ile w pliku źródłowym występuje rzeczywisty rozszerzony znak i ten sam rozszerzony znak, wyrażony w pliku źródłowym jako uniwersalna nazwa znakowa o numerze (tj. Z użyciem \ uXXXX notacja), są traktowane równoważnie wyjątkiem przypadków, gdy jest to wymiana powrócił w surowego ciąg dosłownym.)
Istnieje wiele terminów standardowych są używane do opisania w jaki sposób oferty wdrożeniowe z kodowania. Oto moja próba jako nieco prostsze, krok po kroku opis tego, co się dzieje:
znaków pliku źródłowego fizyczne są odwzorowane, w realizacji zdefiniowanej sposób na zasadowy charakter źródłowy ustaw [...]
Kwestia kodowania plików jest ręczna; Standard tylko dba o podstawowy zestaw znaków źródłowych i pozostawia miejsce na implementację, aby się tam dostać.
Każdy plik źródłowy postać nie w podstawowym zestawie znaków źródło (2.3) otrzymuje przez znakowy imię uniwersalnego, który wyznacza ten znak.
Podstawowy zestaw źródeł to prosta lista dozwolonych znaków. To nie jest ASCII (patrz dalej). Wszystko, co nie znajduje się na tej liście, jest "przekształcane" (przynajmniej koncepcyjnie) w formularz \uXXXX
.
Więc bez względu na to, jaki rodzaj literału lub kodowania pliku jest używany, kod źródłowy jest konceptualnie przekształcany w podstawowy zestaw znaków + pęczek \uXXXX
. Mówię konceptualnie, ponieważ to, co faktycznie robią implementacje, jest zwykle prostsze, np. ponieważ mogą obsługiwać Unicode bezpośrednio. Ważną częścią jest to, że to, co Standard wywołuje rozszerzony znak (tj. Nie z podstawowego zestawu źródłowego), powinno być nierozróżnialne w użyciu od równoważnego formularza \uXXXX
. Zauważ, że C++ 03 jest dostępny na przykład Platformy EBCDIC, więc twoje rozumowanie w kategoriach ASCII jest wadliwe od samego początku.
Wreszcie, opisany przeze mnie proces dotyczy literałów ciągłych (nieskodowanych). Oznacza to, że kod jest równoważny jakby zostały napisane:
string utf8string a = u8"L'h\u00F4tel de ville doit \u00EAtre l\u00E0-bas. \u00C7a c'est un fait!";
string utf16string b = u"L'h\u00F4tel de ville doit \u00EAtre l\u00E0-bas. \u00C7a c'est un fait!";
string utf32string c = U"L'h\u00F4tel de ville doit \u00EAtre l\u00E0-bas. \u00C7a c'est un fait!";
Potrzebujesz "const" przed tymi literałami. –
@Nicol Nie. Nawet zakładając, że masz na myśli deklarowane zmienne, nie. –
@Nicol: Dlaczego co kto? 'char x [] =" a "; x [0] = b; ' –