Uma solução simples de um cabeçalho para suportar strings utf8 em C e C++.
Funções fornecidas a partir do cabeçalho C string.h mas com um prefixo utf8* em vez do prefixo str*:
Documentos de função da API
string.h | utf8.h | completo | Constexpr do C++ 14 |
---|---|---|---|
strcat | utf8cat | ✔ | |
strchr | utf8chr | ✔ | ✔ |
strcmp | utf8cmp | ✔ | ✔ |
strcol | utf8col | ||
strcpy | utf8cpy | ✔ | |
strcspn | utf8cspn | ✔ | ✔ |
forte | utf8dup | ✔ | |
forte | utf8fry | ||
Strlen | utf8len | ✔ | ✔ |
forte | utf8nlen | ✔ | ✔ |
strncat | utf8ncat | ✔ | |
strncmp | utf8ncmp | ✔ | ✔ |
forte | utf8ncpy | ✔ | |
forte | utf8ndup | ✔ | |
strpbrk | utf8pbrk | ✔ | ✔ |
strrchr | utf8rchr | ✔ | ✔ |
strsep | utf8sep | ||
strspn | utf8spn | ✔ | ✔ |
strstr | utf8str | ✔ | ✔ |
strtok | utf8tok | ||
strxfrm | utf8xfrm |
Funções fornecidas a partir do cabeçalho C strings.h mas com um prefixo utf8* em vez do prefixo str*:
strings.h | utf8.h | completo | Constexpr do C++ 14 |
---|---|---|---|
strcasecmp | utf8casecmp | ✔ | |
strncasecmp | utf8ncasecmp | ✔ | |
strcasestr | utf8casestr | ✔ |
Funções fornecidas que são exclusivas do utf8.h:
utf8.h | completo | Constexpr do C++ 14 |
---|---|---|
ponto de código utf8 | ✔ | ✔ |
utf8rcodepoint | ✔ | ✔ |
tamanho utf8 | ✔ | ✔ |
utf8size_lazy | ✔ | ✔ |
utf8nsize_lazy | ✔ | ✔ |
utf8 válido | ✔ | ✔ |
utf8nválido | ✔ | ✔ |
utf8makevalid | ✔ | |
utf8codepointsize | ✔ | ✔ |
ponto de código utf8cat | ✔ | |
utf8isupper | ✔ | |
utf8islower | ✔ | |
utf8lwr | ||
utf8upr | ||
utf8lwrcodepoint | ✔ | |
utf8uprcodepoint | ✔ |
Basta #include "utf8.h"
no seu código!
As plataformas atualmente suportadas são Linux, macOS e Windows.
Os compiladores atualmente suportados são gcc, clang, cl.exe do MSVC e clang-cl.exe.
A API utf8.h corresponde à API string.h tanto quanto possível por design. No entanto, existem algumas diferenças importantes.
utf8.h usa char8_t* em C++ 20 em vez de char*
Em qualquer lugar na documentação string.h ou strings.h onde se refere a 'bytes', mudei isso para pontos de código utf8. Por exemplo, utf8len retornará o número de pontos de código utf8 em uma string utf8 - o que não equivale necessariamente ao número de bytes.
int utf8casecmp ( const void * src1 , const void * src2 );
Retorna menor que 0, 0, maior que 0 se src1 < src2
, src1 == src2
, src1 > src2
respectivamente, sem distinção entre maiúsculas e minúsculas.
void * utf8cat ( void * dst , const void * src );
Anexe a string utf8 src
à string utf8 dst
.
void * utf8chr ( const void * src , utf8_int32_t chr );
Encontre a primeira correspondência do codepoint utf8 chr
na string utf8 src
.
int utf8cmp ( const void * src1 , const void * src2 );
Retorne menor que 0, 0, maior que 0 se src1 < src2
,
src1 == src2
, src1 > src2
respectivamente.
void * utf8cpy ( void * dst , const void * src );
Copie a string utf8 src
na memória alocada em dst
.
size_t utf8cspn ( const void * src , const void * reject );
Número de pontos de código utf8 na string utf8 src
que consiste inteiramente
de pontos de código utf8 não da string utf8 reject
.
void * utf8dup ( const void * src );
Duplique a string utf8 src
obtendo seu tamanho, malloc
e um novo buffer
copiando os dados e retornando-os. Ou 0 se malloc
falhar.
size_t utf8len ( const void * str );
Número de pontos de código utf8 na string utf8 str
,
excluindo o byte de terminação nulo.
size_t utf8nlen ( const void * str , size_t n );
Semelhante a utf8len
, exceto que apenas no máximo n
bytes de src
são visualizados.
int utf8ncasecmp ( const void * src1 , const void * src2 , size_t n );
Retorne menor que 0, 0, maior que 0 se src1 < src2
, src1 == src2
,
src1 > src2
respectivamente, sem distinção entre maiúsculas e minúsculas. Verificando no máximo n
bytes de cada string utf8.
void * utf8ncat ( void * dst , const void * src , size_t n );
Anexe a string utf8 src
à string utf8 dst
,
escrevendo no máximo n+1
bytes. Pode produzir um utf8 inválido
string se n
cair no meio de um codepoint utf8.
int utf8ncmp ( const void * src1 , const void * src2 , size_t n );
Retorne menor que 0, 0, maior que 0 se src1 < src2
,
src1 == src2
, src1 > src2
respectivamente. Verificando no máximo n
bytes de cada string utf8.
void * utf8ncpy ( void * dst , const void * src , size_t n );
Copie a string utf8 src
na memória alocada em dst
.
Copia no máximo n
bytes. Se n
cair no meio de um ponto de código utf8 ou se dst
não tiver espaço suficiente para um terminador nulo, a string final será interrompida para preservar a validade do utf8.
void * utf8pbrk ( const void * str , const void * accept );
Localiza a primeira ocorrência na string utf8 str
de qualquer byte no
utf8 string accept
ou 0 se nenhuma correspondência for encontrada.
void * utf8rchr ( const void * src , utf8_int32_t chr );
Encontre a última correspondência do codepoint utf8 chr
na string utf8 src
.
size_t utf8size ( const void * str );
Número de bytes na string utf8 str
,
incluindo o byte de terminação nulo.
size_t utf8size_lazy ( const void * str );
Semelhante a utf8size
, exceto que o byte de terminação nulo é excluído .
size_t utf8nsize_lazy ( const void * str , size_t n );
Semelhante ao utf8size
, exceto que apenas no máximo n
bytes de src
são visualizados e o byte de terminação nulo é excluído .
size_t utf8spn ( const void * src , const void * accept );
Número de pontos de código utf8 na string utf8 src
que consiste inteiramente
de pontos de código utf8 da string utf8 accept
.
void * utf8str ( const void * haystack , const void * needle );
A posição da needle
da corda utf8 no haystack
da corda utf8.
void * utf8casestr ( const void * haystack , const void * needle );
A posição da needle
da string utf8 no haystack
da string utf8, sem distinção entre maiúsculas e minúsculas.
void * utf8valid ( const void * str );
Retorna 0 em caso de sucesso ou a posição do codepoint utf8 inválido em caso de falha.
void * utf8nvalid ( const void * str , size_t n );
Semelhante a utf8valid
, exceto que apenas no máximo n
bytes de src
são visualizados.
int utf8makevalid ( void * str , utf8_int32_t replacement );
Retorne 0 em caso de sucesso. Torna o str
válido substituindo sequências inválidas pelo ponto de código replacement
de 1 byte.
void * utf8codepoint ( const void * str , utf8_int32_t * out_codepoint );
Define out_codepoint como o ponto de código utf8 atual em str
e retorna o endereço do próximo ponto de código utf8 após o atual em str
.
void * utf8rcodepoint ( const void * str , utf8_int32_t * out_codepoint );
Define out_codepoint como o ponto de código utf8 atual em str
e retorna o endereço do ponto de código utf8 anterior antes do atual em str
.
size_t utf8codepointsize ( utf8_int32_t chr );
Retorna o tamanho do codepoint fornecido em bytes.
void * utf8catcodepoint ( void * utf8_restrict str , utf8_int32_t chr , size_t n );
Escreva um ponto de código na string fornecida e retorne o endereço para o próximo local após o ponto de código escrito. Passe quantos bytes restantes no buffer para n. Se não houver espaço suficiente para o codepoint, esta função retornará nulo.
int utf8islower ( utf8_int32_t chr );
Retorna 1 se o caractere fornecido for minúsculo ou 0 se não for.
int utf8isupper ( utf8_int32_t chr );
Retorna 1 se o caractere fornecido for maiúsculo ou 0 se não for.
void utf8lwr ( void * utf8_restrict str );
Transforme a string fornecida em todos os pontos de código minúsculos.
void utf8upr ( void * utf8_restrict str );
Transforme a string fornecida em todos os pontos de código maiúsculos.
utf8_int32_t utf8lwrcodepoint ( utf8_int32_t cp );
Coloque um ponto de código em letras minúsculas, se possível.
utf8_int32_t utf8uprcodepoint ( utf8_int32_t cp );
Coloque um ponto de código em maiúscula, se possível.
Várias funções fornecidas farão comparações sem distinção entre maiúsculas e minúsculas ou transformarão strings utf8 de um caso para outro. Dada a vastidão do Unicode e a falta de compreensão dos autores além dos pontos de código latinos sobre se maiúsculas e minúsculas significam alguma coisa, as seguintes categorias são as únicas que serão verificadas em códigos que não diferenciam maiúsculas de minúsculas:
Este é um software gratuito e desimpedido lançado em domínio público.
Qualquer pessoa é livre para copiar, modificar, publicar, usar, compilar, vender ou distribuir este software, seja na forma de código-fonte ou como binário compilado, para qualquer finalidade, comercial ou não comercial, e por qualquer meio.
Em jurisdições que reconhecem leis de direitos autorais, o autor ou autores deste software dedicam todo e qualquer direito autoral do software ao domínio público. Fazemos esta dedicação em benefício do público em geral e em detrimento dos nossos herdeiros e sucessores. Pretendemos que esta dedicação seja um ato aberto de renúncia perpétua de todos os direitos presentes e futuros a este software sob a lei de direitos autorais.
O SOFTWARE É FORNECIDO "COMO ESTÁ", SEM GARANTIA DE QUALQUER TIPO, EXPRESSA OU IMPLÍCITA, INCLUINDO, MAS NÃO SE LIMITANDO ÀS GARANTIAS DE COMERCIALIZAÇÃO, ADEQUAÇÃO A UM DETERMINADO FIM E NÃO VIOLAÇÃO. EM HIPÓTESE ALGUMA OS AUTORES SERÃO RESPONSÁVEIS POR QUALQUER RECLAMAÇÃO, DANOS OU OUTRA RESPONSABILIDADE, SEJA EM UMA AÇÃO DE CONTRATO, ATO ILÍCITO OU DE OUTRA FORMA, DECORRENTE DE, OU EM CONEXÃO COM O SOFTWARE OU O USO OU OUTRAS NEGOCIAÇÕES NO SOFTWARE.
Para obter mais informações, consulte http://unlicense.org/