Будет ли у нас size_t strlen (const char8_t *) в будущей версии C ++ - PullRequest
0 голосов
/ 04 апреля 2020

char8_t в C ++ 20 исправляет некоторые проблемы char, поэтому я подумывал об использовании char8_t вместо char для текста utf8 (например, текста из командной строки). Но затем я заметил, что strlen не было указано в стандарте, который будет использоваться с char8_t, фактически ни одна из функций в библиотеке cstring не является. Могу ли я ожидать, что это произойдет в следующем стандартном обновлении? Или char8_t никогда не предназначен для замены char в моем понимании?

Ответы [ 3 ]

4 голосов
/ 05 апреля 2020

Я являюсь автором предложений P0482 и P1423 char8_t.

Цель этих предложений заключалась в том, чтобы ввести тип char8_t с один и тот же уровень поддержки присутствует для char16_t и char32_t, а затем будет добавлен дополнительный функционал. Эти предложения были приняты в конце цикла разработки C ++ 20 (на совещаниях San D iego и Cologne соответственно), поэтому не было возможности предоставить дополнительные функции для C ++ 20.

Одна из директив SG16 , как описано в P1238 , заключается в стандартизации нового контейнера текста с учетом кодирования и типов просмотра. Работа в этой области продвигается, и мы надеемся выпустить ее для C ++ 23. Есть надежда, что эти новые контейнеры и представления вытеснят много необработанной обработки строк в C ++.

Что касается конкретно strlen, strlen - это C API. N2231 - это предложение добавить поддержку char8_t в C (опять же, на том же уровне, что и существующая поддержка char16_t и char32_t). Это предложение еще не принято РГ14. Если предположить, что в конечном итоге он будет принят, то было бы целесообразно использовать дополнительные функции управления строками C на основе char8_t (возможно, также улучшив поддержку char16_t и char32_t).

В В настоящее время я работаю над завершением реализации N2231 в g cc и glib c. Как только это будет завершено, я намерен представить редакцию N2231 в WG14.

Вы можете помочь! SG16 - открытая группа. Пожалуйста, не стесняйтесь подписываться на нашу рассылку, присоединяйтесь к нам в Slack, делитесь своими идеями, потребностями и желаниями, а также пишите предложения по новым функциям (мы можем помочь с этим).

1 голос
/ 05 апреля 2020

char8_t предназначен для строк в кодировке UTF-8. Таким образом, API-интерфейсы, которые их потребляют, будут предполагаемыми пользователями, чтобы быть знакомыми с Unicode на некотором уровне. Довольно большое количество содержимого <cstring> заголовка было бы неуместно для char8_t, так как их поведение в значительной степени не соответствует Unicode (будет ли strcmp делать правильное сопоставление Unicode?).

Если вам нужен доступ к функциям, которые работают аналогично функциям <cstring>, то вы обнаружите, что std::char_trait<char8_t> содержит некоторые полезные , в частности length (в точности как strlen) и compare (явно лексикографический). Большая часть остальной части <cstring> может быть адекватно обработана с помощью алгоритмов C ++.

1 голос
/ 04 апреля 2020

Эти новые типы символов предназначены для использования строкового шаблона C ++ std::basic_string, а именно для определения std::u8string. Поэтому в вашем случае лучше всего использовать строки C ++.

Что касается будущей поддержки char8_t в библиотеке cstring, я полагаю, что этот вопрос больше подходит для будущего стандарта C. Боюсь, это будет непростое и маловероятное обновление, поскольку C не имеет перегруженных функций, и для этого обновления потребуются новые функции, такие как c8slen в дополнение к strlen и wcslen.

...