Una solución sencilla de un encabezado para admitir cadenas utf8 en C y C++.
Funciones proporcionadas desde el encabezado C string.h pero con un prefijo utf8* en lugar del prefijo str*:
Documentos de funciones API
cadena.h | utf8.h | completo | C++14 constexpr |
---|---|---|---|
strcat | utf8cat | ✔ | |
strchr | utf8chr | ✔ | ✔ |
strcmp | utf8cmp | ✔ | ✔ |
strcoll | utf8coll | ||
strcpy | utf8cpy | ✔ | |
strcspn | utf8cspn | ✔ | ✔ |
strdup | utf8dup | ✔ | |
freír | utf8fry | ||
strlen | utf8len | ✔ | ✔ |
estrangular | utf8nlen | ✔ | ✔ |
strncat | utf8ncat | ✔ | |
strncmp | utf8ncmp | ✔ | ✔ |
strncpy | utf8ncpy | ✔ | |
estirar | utf8ndup | ✔ | |
strpbrk | utf8pbrk | ✔ | ✔ |
strrchr | utf8rchr | ✔ | ✔ |
strep | utf8sep | ||
strspn | utf8spn | ✔ | ✔ |
strstr | utf8str | ✔ | ✔ |
strtok | utf8tok | ||
strxfrm | utf8xfrm |
Funciones proporcionadas desde el encabezado C strings.h pero con un prefijo utf8* en lugar del prefijo str*:
cuerdas.h | utf8.h | completo | C++14 constexpr |
---|---|---|---|
strcasecmp | utf8casecmp | ✔ | |
strncasecmp | utf8ncasecmp | ✔ | |
strcasestr | utf8casestr | ✔ |
Funciones proporcionadas que son exclusivas de utf8.h:
utf8.h | completo | C++14 constexpr |
---|---|---|
punto de código utf8 | ✔ | ✔ |
punto de código utf8r | ✔ | ✔ |
tamaño utf8 | ✔ | ✔ |
utf8size_lazy | ✔ | ✔ |
utf8nsize_lazy | ✔ | ✔ |
utf8válido | ✔ | ✔ |
utf8nválido | ✔ | ✔ |
utf8makevalid | ✔ | |
tamaño de punto de código utf8 | ✔ | ✔ |
punto de código utf8cat | ✔ | |
utf8issuperior | ✔ | |
utf8islower | ✔ | |
utf8lwr | ||
utf8upr | ||
punto de código utf8lwr | ✔ | |
punto de código utf8upr | ✔ |
¡Simplemente #include "utf8.h"
en tu código!
Las plataformas soportadas actualmente son Linux, macOS y Windows.
Los compiladores admitidos actualmente son gcc, clang, cl.exe de MSVC y clang-cl.exe.
La API utf8.h coincide con la API string.h tanto como sea posible por diseño. Sin embargo, existen algunas diferencias importantes.
utf8.h usa char8_t* en C++ 20 en lugar de char*
En cualquier lugar de la documentación de string.h o strings.h donde se refiera a 'bytes', lo cambié a puntos de código utf8. Por ejemplo, utf8len devolverá el número de puntos de código utf8 en una cadena utf8, lo que no necesariamente equivale al número de bytes.
int utf8casecmp ( const void * src1 , const void * src2 );
Devuelve menos de 0, 0, mayor que 0 si src1 < src2
, src1 == src2
, src1 > src2
respectivamente, no distingue entre mayúsculas y minúsculas.
void * utf8cat ( void * dst , const void * src );
Agregue la cadena utf8 src
a la cadena utf8 dst
.
void * utf8chr ( const void * src , utf8_int32_t chr );
Encuentre la primera coincidencia del punto de código utf8 chr
en la cadena utf8 src
.
int utf8cmp ( const void * src1 , const void * src2 );
Devuelve menos de 0, 0, mayor que 0 si src1 < src2
,
src1 == src2
, src1 > src2
respectivamente.
void * utf8cpy ( void * dst , const void * src );
Copie la cadena utf8 src
en la memoria asignada en dst
.
size_t utf8cspn ( const void * src , const void * reject );
Número de puntos de código utf8 en la cadena utf8 src
que consta enteramente
de puntos de código utf8 que no provienen de la cadena utf8 reject
.
void * utf8dup ( const void * src );
Duplique la cadena utf8 src
obteniendo su tamaño y malloc
un nuevo búfer
copiar los datos y devolverlos. O 0 si falló malloc
.
size_t utf8len ( const void * str );
Número de puntos de código utf8 en la cadena utf8 str
,
excluyendo el byte de terminación nulo.
size_t utf8nlen ( const void * str , size_t n );
Similar a utf8len
, excepto que solo se buscan como máximo n
bytes de src
.
int utf8ncasecmp ( const void * src1 , const void * src2 , size_t n );
Devuelve menos de 0, 0, mayor que 0 si src1 < src2
, src1 == src2
,
src1 > src2
respectivamente, no distingue entre mayúsculas y minúsculas. Comprobando como máximo n
bytes de cada cadena utf8.
void * utf8ncat ( void * dst , const void * src , size_t n );
Agregue la cadena utf8 src
a la cadena utf8 dst
,
escribiendo como máximo n+1
bytes. Puede producir un utf8 no válido
cadena si n
cae hasta la mitad de un punto de código utf8.
int utf8ncmp ( const void * src1 , const void * src2 , size_t n );
Devuelve menos de 0, 0, mayor que 0 si src1 < src2
,
src1 == src2
, src1 > src2
respectivamente. Comprobando como máximo n
bytes de cada cadena utf8.
void * utf8ncpy ( void * dst , const void * src , size_t n );
Copie la cadena utf8 src
en la memoria asignada en dst
.
Copia como máximo n
bytes. Si n
cae a mitad de camino de un punto de código utf8, o si dst
no tiene suficiente espacio para un terminador nulo, la cadena final se acortará para preservar la validez de utf8.
void * utf8pbrk ( const void * str , const void * accept );
Localiza la primera aparición en la cadena utf8 str
de cualquier byte en el
Cadena utf8 accept
, o 0 si no se encontró ninguna coincidencia.
void * utf8rchr ( const void * src , utf8_int32_t chr );
Encuentre la última coincidencia del punto de código utf8 chr
en la cadena utf8 src
.
size_t utf8size ( const void * str );
Número de bytes en la cadena utf8 str
,
incluido el byte de terminación nulo.
size_t utf8size_lazy ( const void * str );
Similar a utf8size
, excepto que se excluye el byte de terminación nulo.
size_t utf8nsize_lazy ( const void * str , size_t n );
Similar a utf8size
, excepto que sólo se buscan como máximo n
bytes de src
y se excluye el byte de terminación nulo.
size_t utf8spn ( const void * src , const void * accept );
Número de puntos de código utf8 en la cadena utf8 src
que consta enteramente
de puntos de código utf8 de la cadena utf8 accept
.
void * utf8str ( const void * haystack , const void * needle );
La posición de la needle
de hilo utf8 en el haystack
de hilo utf8.
void * utf8casestr ( const void * haystack , const void * needle );
La posición de la needle
de hilo utf8 en el haystack
de hilo utf8, no distingue entre mayúsculas y minúsculas.
void * utf8valid ( const void * str );
Devuelve 0 en caso de éxito, o la posición del punto de código utf8 no válido en caso de error.
void * utf8nvalid ( const void * str , size_t n );
Similar a utf8valid
, excepto que solo se buscan como máximo n
bytes de src
.
int utf8makevalid ( void * str , utf8_int32_t replacement );
Devuelve 0 en caso de éxito. Hace que la str
sea válida reemplazando secuencias no válidas con el punto de código replacement
de 1 byte.
void * utf8codepoint ( const void * str , utf8_int32_t * out_codepoint );
Establece out_codepoint en el punto de código utf8 actual en str
y devuelve la dirección del siguiente punto de código utf8 después del actual en str
.
void * utf8rcodepoint ( const void * str , utf8_int32_t * out_codepoint );
Establece out_codepoint en el punto de código utf8 actual en str
y devuelve la dirección del punto de código utf8 anterior al actual en str
.
size_t utf8codepointsize ( utf8_int32_t chr );
Devuelve el tamaño del punto de código dado en bytes.
void * utf8catcodepoint ( void * utf8_restrict str , utf8_int32_t chr , size_t n );
Escriba un punto de código en la cadena dada y devuelva la dirección al siguiente lugar después del punto de código escrito. Pase cuántos bytes quedan en el búfer a n. Si no hay suficiente espacio para el punto de código, esta función devuelve nulo.
int utf8islower ( utf8_int32_t chr );
Devuelve 1 si el carácter dado está en minúscula o 0 si no lo es.
int utf8isupper ( utf8_int32_t chr );
Devuelve 1 si el carácter dado está en mayúscula o 0 si no lo es.
void utf8lwr ( void * utf8_restrict str );
Transforme la cadena dada en todos los puntos de código en minúsculas.
void utf8upr ( void * utf8_restrict str );
Transforme la cadena dada en todos los puntos de código en mayúsculas.
utf8_int32_t utf8lwrcodepoint ( utf8_int32_t cp );
Si es posible, escriba un punto de código en minúsculas.
utf8_int32_t utf8uprcodepoint ( utf8_int32_t cp );
Si es posible, escriba un punto de código en mayúsculas.
Varias funciones proporcionadas realizarán comparaciones que no distinguen entre mayúsculas y minúsculas o transformarán cadenas utf8 de un caso a otro. Dada la inmensidad de Unicode y la falta de comprensión de los autores más allá de los puntos de código latino sobre si caso significa algo, las siguientes categorías son las únicas que se verificarán en el código que no distingue entre mayúsculas y minúsculas:
Este es un software gratuito y sin trabas lanzado al dominio público.
Cualquier persona es libre de copiar, modificar, publicar, usar, compilar, vender o distribuir este software, ya sea en forma de código fuente o como binario compilado, para cualquier propósito, comercial o no comercial, y por cualquier medio.
En jurisdicciones que reconocen las leyes de derechos de autor, el autor o autores de este software dedican todos y cada uno de los derechos de autor del software al dominio público. Hacemos esta dedicación en beneficio del público en general y en perjuicio de nuestros herederos y sucesores. Pretendemos que esta dedicación sea un acto abierto de renuncia a perpetuidad de todos los derechos presentes y futuros de este software según la ley de derechos de autor.
EL SOFTWARE SE PROPORCIONA "TAL CUAL", SIN GARANTÍA DE NINGÚN TIPO, EXPRESA O IMPLÍCITA, INCLUYENDO, PERO NO LIMITADO A, LAS GARANTÍAS DE COMERCIABILIDAD, IDONEIDAD PARA UN PROPÓSITO PARTICULAR Y NO INFRACCIÓN. EN NINGÚN CASO LOS AUTORES SERÁN RESPONSABLES DE NINGÚN RECLAMO, DAÑO U OTRA RESPONSABILIDAD, YA SEA EN UNA ACCIÓN CONTRACTUAL, AGRAVIO O DE OTRA MANERA, QUE SURJA DE, FUERA DE O EN RELACIÓN CON EL SOFTWARE O EL USO U OTRAS NEGOCIOS EN EL SOFTWARE.
Para obtener más información, consulte http://unlicense.org/