Как вы можете безопасно объявить 16-битный строковый литерал в C? - PullRequest
0 голосов
/ 02 июня 2018

Я знаю, что уже существует стандартный метод с префиксом L:

wchar_t *test_literal = L"Test";

Проблема в том, что wchar_t не гарантированно будет 16-битным, но для моего проектаМне нужен 16-битный wchar_t.Я также хотел бы избежать требования о передаче -fshort-wchar.

Итак, есть ли префикс для C (не C ++), который позволил бы мне объявить строковый литерал UTF-16?

Ответы [ 2 ]

0 голосов
/ 02 июня 2018

Вам нужен 16-битный wchar_t - но он вне вашего контроля.Если компилятор говорит, что он 32-битный, то он 32-битный, и это не имеет значения, что вы хотите или нужно.

Строковые классы являются шаблонными.Вы всегда можете использовать шаблон для создания шаблонного класса с 16-битными символами.Я лично попытался бы удалить любую обработку Unicode, которая не является UTF-8.

Альтернативный метод - умный #ifdef, который выдаст ошибку времени компиляции, если wchar_t не является 16-битным, и решит проблему, когда вына самом деле нужно решить это.

0 голосов
/ 02 июня 2018

Итак, есть ли префикс для 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-битные элементы.

...