Ответы на ваши вопросы (в том же порядке):
Почему выбирают?xcode использует C99 в настройках по умолчанию.См. черновую спецификацию C0X 6.4.3 по универсальным именам символов.См. Ниже.
Более технически, @"\U0001d11e
- это 32-битная кодовая точка Unicode для этого символа в наборе ISO 10646 .
Я бы не рассчитывал, что это поведение сработает.Вы должны, безусловно, безоговорочно, чтобы все символы в вашем исходном файле были 7-битными ASCII.Для строковых литералов используйте кодировку или, предпочтительно, подходящий внешний ресурс, способный обрабатывать двоичные данные.
Универсальные имена персонажей (из WG14 / N1256 C0X Draft, за которым CLANG следует довольно хорошо):
Универсальные имена символов могут использоваться в идентификаторах, символьные константы и строковые литералы для обозначения символов, не входящих в базовый набор символов.
Универсальное имя символа \ Unnnnnnnn обозначает символ, чей восьмизначный короткий идентификатор (как указано в ИСО / МЭК 10646) равен nnnnnnnn) Точно так же имя универсального символа \ unnnn обозначает символ, чей четырехзначный короткий идентификатор nnnn (ичей восьмизначный короткий идентификатор 0000nnnn).
Поэтому вы можете создать свой символ или строку естественным смешанным способом:
char *utf8CStr =
"May all your CLEF's \xF0\x9D\x84\x9E be left like this: \U0001d11e";
NSString *uni4=[[NSString alloc] initWithUTF8String:utf8CStr];
Форма \Unnnnnnnn
позволяетВы должны выбрать любую кодовую точку Unicode, и это то же значение, что и поле «Unicode» в левом нижнем углу окна просмотра символов.Прямая запись \Unnnnnnnn
в исходном файле C99 обрабатывается соответствующим образом компилятором.Обратите внимание, что есть только два параметра: \unnnn
, который представляет собой 256-символьное смещение по отношению к кодовой странице по умолчанию, или \Unnnnnnnn
, который является полным 32-битным символом любой кодовой точки Unicode.Вам нужно дополнить 0 нулями, если вы не используете все 4 или все 8 цифр или \ u или \ U.
Форма \xF0\x9D\x84\x9E
в том же строковом литерале более интересна.Это вставка необработанной кодировки UTF-8 того же символа.Однажды передается методу initWithUTF8String
, но литерал и закодированный литерал заканчиваются как кодированный UTF-8.
Возможно, может быть нарушением 130 раздела 5.1.1.2 для использования необработанных байтов таким способом.Учитывая, что необработанная строка UTF-8 будет закодирована аналогичным образом, я думаю, что вы в порядке.