Я переношу приложение с помощью char*
для всего и везде, используя UCS4, поскольку это внутреннее представление Unicode. Я использую C11's U"unicode literals"
для определения строк, которые расширяются до массивов char32_t
, которые по существу являются uint32_t
.Как правильно использовать `__attribute __ ((format (printf, x, y)))` для C11 U "Unicode литералы"?
Проблема заключается в надлежащей аннотации printf
-подобных функций. Поскольку «формат» больше не char*
, компилятор отказывается компилировать его дальше, так же он будет недоволен char32_t *
вместо char *
для формата %s
, я полагаю.
Я не зависим от stdlib *printf
семьи вообще, поэтому форматирование выполняется исключительно по моей реализации.
Какое правильное решение для этого, кроме как полностью отключить этот атрибут?
Вопрос: Какую выгоду вы бы выиграли от использования UTF-32 вместо UTF-8? И вы действительно уверены, что это того стоит? (UTF-32 имеет также символы с несколькими кодами.) – Deduplicator
Мое приложение работает исключительно на кодовых точках, поэтому нет смысла рассматривать кластеры grapheme, воспринимаемые пользователем символы и т. Д. На данный момент UCS4 значительно упрощает обработку строк, поскольку я могу повторно использовать большую часть существующей кодовой базы, и я буду переносить внутреннее представление в UTF8 на следующей итерации. – toriningen
Я также, кажется, пропустил пункт 'U ... ...' 'материал, кажется сложным шагом, в частности, поскольку C11 добавляет лишь незначительную поддержку для их обработки. Вы могли бы просто использовать нотацию '' \ u2002 '' для реализации всех кодов Юникода, которые вам нужны как mbs. Для самого вопроса вы должны, вероятно, напрямую обратиться к людям gcc. Это не очень распространено, поэтому вам действительно нужен их опыт в этом вопросе. –