Будет ли у нас 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++.