Будет ли у нас size_t strlen(const char8_t*) в будущей версии C++

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

4 ответа

Я автор P0482 и P1423 char8_t предложения.

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

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

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

В настоящее время я работаю над завершением реализации N2231 в gcc и glibc. Как только это будет завершено, я намерен представить WG14 пересмотренный вариант N2231.

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

0 по-прежнему может действовать как нуль-терминатор в строках utf8, поэтому технически ничто не мешает вам (кроме отсутствия соответствующей функции) использовать strlen для подсчета количества байтов (!) в последовательности utf8. Если вы хотите найти количество символов, вам понадобится отдельная функция.

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

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

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

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

Другие вопросы по тегам