Простое решение с одним заголовком для поддержки строк utf8 в C и C++.
Функции, предоставляемые из заголовка C string.h, но с префиксом utf8* вместо префикса str*:
Документация по функциям API
| строка.h | utf8.h | полный | С++ 14 constexpr |
|---|---|---|---|
| strcat | utf8cat | ✔ | |
| стрхр | utf8chr | ✔ | ✔ |
| стркмп | utf8cmp | ✔ | ✔ |
| стрколл | utf8coll | ||
| стркпи | utf8cpy | ✔ | |
| стркспн | utf8cspn | ✔ | ✔ |
| стрдуп | utf8dup | ✔ | |
| Стрфри | utf8fry | ||
| стрлен | utf8len | ✔ | ✔ |
| стрнлен | utf8nlen | ✔ | ✔ |
| стрнкат | utf8ncat | ✔ | |
| стрнкмп | utf8ncmp | ✔ | ✔ |
| стрнкпи | utf8ncpy | ✔ | |
| стрндуп | utf8ndup | ✔ | |
| стрпбрк | utf8pbrk | ✔ | ✔ |
| стррчр | utf8rhr | ✔ | ✔ |
| стрсеп | utf8sep | ||
| стрспн | utf8spn | ✔ | ✔ |
| стрстр | utf8str | ✔ | ✔ |
| стрток | utf8tok | ||
| strxfrm | utf8xfrm |
Функции, предоставляемые из заголовка C strings.h, но с префиксом utf8* вместо префикса str*:
| strings.h | utf8.h | полный | С++ 14 constexpr |
|---|---|---|---|
| strcasecmp | utf8casecmp | ✔ | |
| strncasecmp | utf8ncasecmp | ✔ | |
| strcasestr | utf8casestr | ✔ |
Предоставляемые функции, уникальные для utf8.h:
| utf8.h | полный | С++ 14 constexpr |
|---|---|---|
| кодовая точка utf8 | ✔ | ✔ |
| utf8rcodepoint | ✔ | ✔ |
| utf8size | ✔ | ✔ |
| utf8size_lazy | ✔ | ✔ |
| utf8nsize_lazy | ✔ | ✔ |
| utf8действительный | ✔ | ✔ |
| utf8nвалид | ✔ | ✔ |
| utf8makevalid | ✔ | |
| utf8codepointsize | ✔ | ✔ |
| utf8catcodepoint | ✔ | |
| utf8isupper | ✔ | |
| utf8islower | ✔ | |
| utf8lwr | ||
| utf8upr | ||
| utf8lwrcodepoint | ✔ | |
| utf8uprcodepoint | ✔ |
Просто #include "utf8.h" в свой код!
В настоящее время поддерживаются платформы Linux, macOS и Windows.
В настоящее время поддерживаются компиляторы gcc, clang, cl.exe MSVC и clang-cl.exe.
API utf8.h максимально соответствует API string.h по дизайну. Однако есть несколько существенных отличий.
utf8.h использует char8_t* в C++ 20 вместо char*
Везде в документации string.h или strings.h, где речь идет о «байтах», я изменил это на кодовые точки utf8. Например, utf8len вернет количество кодовых точек utf8 в строке utf8, что не обязательно соответствует количеству байтов.
int utf8casecmp ( const void * src1 , const void * src2 ); Возвращает меньше 0, 0, больше 0, если src1 < src2 , src1 == src2 , src1 > src2 соответственно, без учета регистра.
void * utf8cat ( void * dst , const void * src ); Добавьте строку utf8 src к строке utf8 dst .
void * utf8chr ( const void * src , utf8_int32_t chr ); Найдите первое совпадение кодовой точки utf8 chr в строке utf8 src .
int utf8cmp ( const void * src1 , const void * src2 ); Возвращает меньше 0, 0, больше 0, если src1 < src2 ,
src1 == src2 , src1 > src2 соответственно.
void * utf8cpy ( void * dst , const void * src ); Скопируйте строку utf8 src в память, выделенную в dst .
size_t utf8cspn ( const void * src , const void * reject ); Количество кодовых точек utf8 в строке utf8 src , состоящей полностью
кодовых точек utf8, не входящих в строку utf8, reject .
void * utf8dup ( const void * src ); Дублируйте строку utf8 src , узнав ее размер и malloc новый буфер.
копирование данных и их возврат. Или 0, если malloc не удалось.
size_t utf8len ( const void * str ); Количество кодовых точек utf8 в строке utf8 str ,
исключая нулевой завершающий байт.
size_t utf8nlen ( const void * str , size_t n ); Аналогично utf8len , за исключением того, что просматривается не более n байт src .
int utf8ncasecmp ( const void * src1 , const void * src2 , size_t n ); Возвращает меньше 0, 0, больше 0, если src1 < src2 , src1 == src2 ,
src1 > src2 соответственно, без учета регистра. Проверка не более n
байты каждой строки utf8.
void * utf8ncat ( void * dst , const void * src , size_t n ); Добавьте строку utf8 src к строке utf8 dst ,
запись не более n+1 байта. Может создать неверный utf8
строка, если n попадает в кодовую точку utf8.
int utf8ncmp ( const void * src1 , const void * src2 , size_t n ); Возвращает меньше 0, 0, больше 0, если src1 < src2 ,
src1 == src2 , src1 > src2 соответственно. Проверка не более n
байты каждой строки utf8.
void * utf8ncpy ( void * dst , const void * src , size_t n ); Скопируйте строку utf8 src в память, выделенную в dst .
Копирует не более n байт. Если n попадает на полпути через кодовую точку utf8 или если dst недостаточно места для нулевого терминатора, последняя строка будет обрезана, чтобы сохранить достоверность utf8.
void * utf8pbrk ( const void * str , const void * accept ); Находит первое вхождение в строке utf8 любого байта в str .
строка utf8 accept или 0, если совпадение не найдено.
void * utf8rchr ( const void * src , utf8_int32_t chr ); Найдите последнее совпадение кодовой точки utf8 chr в строке utf8 src .
size_t utf8size ( const void * str ); Количество байтов в строке utf8 str ,
включая нулевой завершающий байт.
size_t utf8size_lazy ( const void * str ); Аналогично utf8size , за исключением того, что нулевой завершающий байт исключается .
size_t utf8nsize_lazy ( const void * str , size_t n ); Аналогично utf8size , за исключением того, что просматривается не более n байт src и исключается нулевой завершающий байт.
size_t utf8spn ( const void * src , const void * accept ); Количество кодовых точек utf8 в строке utf8 src , состоящей полностью
кодовых точек utf8 из строки utf8 accept .
void * utf8str ( const void * haystack , const void * needle ); Положение needle строки utf8 в haystack строки utf8.
void * utf8casestr ( const void * haystack , const void * needle ); Положение needle строки utf8 в haystack строки utf8, без учета регистра.
void * utf8valid ( const void * str );Возвращает 0 в случае успеха или позицию недопустимого кода utf8 в случае неудачи.
void * utf8nvalid ( const void * str , size_t n ); Аналогично utf8valid , за исключением того, что просматривается не более n байт src .
int utf8makevalid ( void * str , utf8_int32_t replacement ); Вернуть 0 в случае успеха. Делает str допустимой, заменяя недопустимые последовательности 1-байтовым кодом replacement .
void * utf8codepoint ( const void * str , utf8_int32_t * out_codepoint ); Устанавливает out_codepoint в текущую кодовую точку utf8 в str и возвращает адрес следующей кодовой точки utf8 после текущей в str .
void * utf8rcodepoint ( const void * str , utf8_int32_t * out_codepoint ); Устанавливает out_codepoint в текущую кодовую точку utf8 в str и возвращает адрес предыдущей кодовой точки utf8 перед текущим в str .
size_t utf8codepointsize ( utf8_int32_t chr );Возвращает размер заданной кодовой точки в байтах.
void * utf8catcodepoint ( void * utf8_restrict str , utf8_int32_t chr , size_t n );Запишите кодовую точку в данную строку и верните адрес в следующее место после записанной кодовой точки. Передайте количество байтов, оставшихся в буфере, в n. Если для кодовой точки недостаточно места, эта функция возвращает значение null.
int utf8islower ( utf8_int32_t chr );Возвращает 1, если данный символ в нижнем регистре, или 0, если это не так.
int utf8isupper ( utf8_int32_t chr );Возвращает 1, если данный символ в верхнем регистре, или 0, если это не так.
void utf8lwr ( void * utf8_restrict str );Преобразуйте данную строку во все кодовые точки нижнего регистра.
void utf8upr ( void * utf8_restrict str );Преобразуйте данную строку во все кодовые точки в верхнем регистре.
utf8_int32_t utf8lwrcodepoint ( utf8_int32_t cp );Если возможно, используйте строчные буквы кода.
utf8_int32_t utf8uprcodepoint ( utf8_int32_t cp );Если возможно, используйте верхний регистр кода.
Различные предоставленные функции будут выполнять сравнения без учета регистра или преобразовывать строки utf8 из одного регистра в другой. Учитывая обширность Юникода и отсутствие у авторов понимания, помимо латинских кодов, о том, означает ли что-нибудь регистр, следующие категории являются единственными, которые будут проверяться в коде, нечувствительном к регистру:
Это бесплатное и ничем не обремененное программное обеспечение, общедоступное.
Любой человек имеет право копировать, изменять, публиковать, использовать, компилировать, продавать или распространять это программное обеспечение в виде исходного кода или в виде скомпилированного двоичного файла для любых целей, коммерческих или некоммерческих, и любыми способами.
В юрисдикциях, которые признают законы об авторском праве, автор или авторы этого программного обеспечения передают все права, связанные с авторскими правами на программное обеспечение, в общественное достояние. Мы делаем это на благо общества в целом и в ущерб нашим наследникам и преемникам. Мы намерены, чтобы это обязательство стало явным актом бессрочного отказа от всех нынешних и будущих прав на это программное обеспечение в соответствии с законом об авторском праве.
ПРОГРАММНОЕ ОБЕСПЕЧЕНИЕ ПРЕДОСТАВЛЯЕТСЯ «КАК ЕСТЬ», БЕЗ КАКИХ-ЛИБО ГАРАНТИЙ, ЯВНЫХ ИЛИ ПОДРАЗУМЕВАЕМЫХ, ВКЛЮЧАЯ, НО НЕ ОГРАНИЧИВАЯСЬ, ГАРАНТИЯМИ ТОВАРНОЙ ЦЕННОСТИ, ПРИГОДНОСТИ ДЛЯ ОПРЕДЕЛЕННОЙ ЦЕЛИ И НЕНАРУШЕНИЯ ПРАВ. АВТОРЫ НИ ПРИ КАКИХ ОБСТОЯТЕЛЬСТВАХ НЕ НЕСУТ ОТВЕТСТВЕННОСТИ ЗА ЛЮБЫЕ ПРЕТЕНЗИИ, УБЫТКИ ИЛИ ДРУГУЮ ОТВЕТСТВЕННОСТЬ, БУДЬ В ДЕЙСТВИЯХ ПО КОНТРАКТУ, ПРАВИЛАМ ИЛИ ДРУГИМ ОБРАЗОМ, ВОЗНИКАЮЩИЕ ИЗ, ИЗ ИЛИ В СВЯЗИ С ПРОГРАММНЫМ ОБЕСПЕЧЕНИЕМ ИЛИ ИСПОЛЬЗОВАНИЕМ ИЛИ ДРУГИМИ ДЕЛАМИ С ПРОГРАММНЫМ ОБЕСПЕЧЕНИЕМ.
Для получения дополнительной информации посетите http://unlicense.org/.