Как указать порядок байтов строковых литералов utf-16 в C ++ 17 с помощью Clang? - PullRequest
0 голосов
/ 15 ноября 2018

Строковые литералы UTF-16, такие как auto str = u"中国字";, разрешены в современном исходном коде C ++.

UTF-16 имеет два порядковых номера: UTF-16LE и UTF-16BE. Стандарт C ++ не определяет порядок байтов строк UTF-16. Итак, я думаю, что это определяется реализацией.

Есть ли способ указать порядок байтов во время компиляции?

1 Ответ

0 голосов
/ 15 ноября 2018

Строковый литерал с префиксом u представляет собой массив const char16_t значений:

C ++ 17 [lex.string] / 10:

Строка-литерал, который начинается с u, например u"asdf", является строковым литералом char16_t.Строковый литерал char16_t имеет тип «массив из n const char16_t», где n - размер строки, как определено ниже;он инициализируется заданными символами.

Таким образом, литерал в кавычке эквивалентен, в системе Unicode:

const char16_t x[] = { 97, 115, 100, 102, 0 };

Другими словами, представление строкилитерал совпадает с представлением этого массива.

Для более сложной строки это все еще массив const char16_t;и может быть несколько кодовых точек на c-char , то есть количество элементов в массиве может быть больше, чем количество символов, которые появляются в строке.


Чтобы ответить на вопрос в заголовке: я не знаю ни одного параметра компилятора (для любого компилятора), который позволял бы вам настраивать порядок байтов char16_t.Я ожидаю, что любая целевая система будет использовать один и тот же порядок байтов для всех целочисленных типов.char16_t должен иметь те же свойства, что и uint_least16_t ([basic.fundamental] / 5).

Если ваш код содержит строковые литералы и вы хотите записать их в файл, как в частности, UTF16-BEНапример, вам нужно будет выполнить обычные проверки / корректировки порядкового номера в случае, если ваша система хранит char16_t в формате с прямым порядком байтов.

...