Является ли новый стандарт более открытым по отношению к Unicode?
Что касается разрешения универсальных имен символов в идентификаторах, ответ - нет;UCN были разрешены в идентификаторах еще в C99 и C ++ 98.Однако компиляторы не выполняли это конкретное требование до недавнего времени.Clang 3.3 Я думаю, что вводит поддержку этого, и у GCC была экспериментальная функция для этого в течение некоторого времениХерб Саттер также упомянул в своем выступлении на Build 2013 «Будущее C ++», что эта функция также появится в VC ++ в какой-то момент.(Хотя IIRC Herb называет его функцией C ++ 11; на самом деле это функция C ++ 98.)
Не ожидается, что идентификаторы будут записываться с использованием UCN.Вместо этого ожидаемое поведение заключается в написании нужного символа с использованием исходной кодировки.Например, источник будет выглядеть так:
long pörk;
not:
long p\u00F6rk;
Однако UCN также полезны для другой цели;Не все компиляторы обязаны принимать одинаковые исходные кодировки, но все современные компиляторы поддерживают некоторую схему кодирования, в которой по крайней мере базовые исходные символы имеют одинаковую кодировку (то есть все современные компиляторы поддерживают некоторую ASCII-совместимую кодировку).
UCN позволяют вам писать исходный код только с основными символами и все же называть расширенные символы.Это полезно, например, при записи строкового литерала «°» в исходном коде, который будет скомпилирован как CP1252 и как UTF-8:
char const *degree_sign = "\u00b0";
Этот строковый литерал кодируется в соответствующую кодировку выполненияна нескольких компиляторах, даже если исходные кодировки различаются, при условии, что компиляторы, по крайней мере, используют одну и ту же кодировку для основных символов.
Может ли (переносимый) исходный код быть в любой кодировке Unicode, например UTF-8, UTF-16 или любая (как когда-либо определенная) кодовая страница?
Стандарт не требуется, но большинство компиляторов принимают исходный код UTF-8.Clang поддерживает только источник UTF-8 (хотя он имеет некоторую совместимость для данных не-UTF-8 в символьных и строковых литералах), gcc позволяет указывать кодировку источника и включает поддержку UTF-8, иVC ++ будет угадывать кодировку и может быть угадан в UTF-8.
(Обновление: VS2015 теперь предоставляет опцию , чтобы исходные и исполнительные наборы символов были UTF-8.)
Могу ли я написать идентификатор с \ u1234 в нем myfu \ u1234ntion (для любых целей)
Да, спецификация обязывает это, хотя, как я уже сказал, не всекомпиляторы реализуют это требование.
Или я могу использовать "имена символов", которые Unicode определяет, как в ICU, то есть
const auto x = "German Braunb\U{LOWERCASE LETTER A WITH DIARESIS}r."u32;
Нет, вы не можете использоватьЮникод длинных имен.
или даже в идентификаторе в самом источнике?Это было бы угощением ... кашель ...
Если компилятор поддерживает кодировку исходного кода, которая содержит расширенный символ, который вы хотите, то этот символ, записанный буквально в источнике, должен обрабатываться точно так жев качестве эквивалента UCN.Так что да, если вы используете компилятор, который поддерживает это требование спецификации C ++, тогда вы можете написать любой символ в его исходном наборе символов непосредственно в источнике, не беспокоясь о написании UCN.