Итак, есть ли какой-либо префикс для C (не C++), который позволит мне объявить строковый литерал UTF-16?
Почти, но не совсем. C2011 предлагает вам следующие варианты:
- литералы символьных строк (элементы типа
char
) - без префикса. Пример: "Test"
- Строковые литералы UTF-8 (элементы типа
char
) - префикс 'u8'. Пример: u8"Test"
- wide string literals of three flavors:
wchar_t
elements - 'L' prefix. Example: L"Test"
- Элементы
char16_t
— префикс 'u'. Пример: u"Test"
char32_t
элементы - префикс 'U'. Пример: U"Test"
Обратите внимание, однако, что, хотя вы можете объявить широкий строковый литерал, содержащий элементы типа char16_t
, стандарт не гарантирует, что для них будет использоваться кодировка UTF-16, а также не предъявляет каких-либо конкретных требований к тому, какие символы не входят в язык. базовый набор символов должен быть включен в набор символов выполнения. Однако вы можете протестировать первое во время компиляции: если char16_t
представляет символы в кодировке UTF-16 в данной соответствующей реализации, то эта реализация определит макрос с __STDC_UTFchar16_t
_
по 1
.
Также обратите внимание, что вам необходимо включить (C) заголовок uchar.h
, чтобы использовать имя типа char16_t
, но синтаксис u"..."
для литералов от этого не зависит. Будьте осторожны, так как это имя заголовка конфликтует с именем, используемым интерфейсом C Международных компонентов для Unicode, относительно широко используемого пакета для поддержки Unicode.
Наконец, имейте в виду, что многое из этого было новым в версии C2011. Чтобы использовать его, вам нужна соответствующая реализация C2011. Они, безусловно, доступны, но есть и множество реализаций, которые соответствуют только более ранним стандартам или даже не соответствуют ни одному из них. Стандарт C99 и более ранние версии не предоставляют синтаксиса строкового литерала, гарантирующего 16-битные элементы.
person
John Bollinger
schedule
02.06.2018
wchar_t
— зачем? - person melpomene   schedule 02.06.2018-fshort-wchar
? - person melpomene   schedule 02.06.2018-fshort-wchar
. - person   schedule 02.06.2018short
,int16_t
) или чего-то еще. Это упростит работу в системах, гдеwchar_t
иUTF-16
не совпадают. - person Peter   schedule 02.06.2018WCHAR
и макросTEXT
, как в Windows. - person   schedule 02.06.2018TEXT
, который принимал литерал в качестве параметра, и в зависимости от того, была ли библиотека построена для ASCII или Unicode, при необходимости добавлял префикс литерала, чтобы превратить его в wchar_t. - person   schedule 02.06.2018wchar_t str[4] = { 'T', 'e', 's', 't' }
- person   schedule 02.06.2018