Простое решение с одним заголовком для поддержки строк 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/.