Итак, есть ли префикс для C (не C ++), который позволил бы мне объявить строковый литерал UTF-16?
Почти, но не совсем.C2011 предлагает вам следующие варианты:
- строковые литералы символов (элементы типа
char
) - без префикса.Пример: "Test"
- Строковые литералы UTF-8 (элементы типа
char
) - префикс 'u8'.Пример: u8"Test"
- строковые литералы трех разновидностей:
wchar_t
elements - префикс 'L'.Пример: L"Test"
char16_t
elements - префикс 'u'.Пример: u"Test"
char32_t
элементов - префикс «U».Пример: U"Test"
Обратите внимание, однако, что хотя вы можете объявить литерал с широкой строкой, имеющий элементы типа char16_t
, стандарт не гарантирует, что UTFДля них будет использоваться кодировка -16, а также она не предъявляет каких-либо особых требований к тому, какие символы вне базового набора символов языка должны быть включены в набор символов выполнения.Однако вы можете протестировать первый во время компиляции: если char16_t
представляет символы в кодировке UTF-16 в данной соответствующей реализации, то эта реализация будет определять макрос от __STDC_UTF_16__
до 1
.
Примечаниетакже, что вам нужно включить (C) заголовок uchar.h
, чтобы использовать имя типа char16_t
, но синтаксис u"..."
для литералов не зависит от этого.Будьте внимательны, так как это имя заголовка вступает в противоречие с именем, используемым интерфейсом C в International Components for Unicode, относительно широко используемом пакете для поддержки Unicode.
Наконец, имейте в виду, что многое из этого было новым в C2011,Чтобы использовать его, вам нужна соответствующая реализация C2011.Они, безусловно, доступны, но так же существует много реализаций, которые соответствуют только более ранним стандартам или даже не соответствуют ни одному.Стандарт C99 и более ранние версии не предоставляют строкового литерального синтаксиса, который гарантирует 16-битные элементы.