Une solution simple à un en-tête pour prendre en charge les chaînes utf8 en C et C++.
Fonctions fournies à partir de l'en-tête C string.h mais avec un préfixe utf8* au lieu du préfixe str* :
Documentation sur les fonctions API
| chaîne.h | utf8.h | complet | Constexpr C++14 |
|---|---|---|---|
| strcat | utf8cat | ✔ | |
| strchr | utf8chr | ✔ | ✔ |
| strcmp | utf8cmp | ✔ | ✔ |
| strcoll | utf8coll | ||
| strcpy | utf8cpy | ✔ | |
| strcspn | utf8cspn | ✔ | ✔ |
| strdup | utf8dup | ✔ | |
| strfry | utf8fry | ||
| strlen | utf8len | ✔ | ✔ |
| étrangler | utf8nlen | ✔ | ✔ |
| strncat | utf8ncat | ✔ | |
| strncmp | utf8ncmp | ✔ | ✔ |
| strncpy | utf8ncpy | ✔ | |
| strndup | utf8ndup | ✔ | |
| strpbrk | utf8pbrk | ✔ | ✔ |
| strrchr | utf8rchr | ✔ | ✔ |
| strep | utf8sep | ||
| strspn | utf8spn | ✔ | ✔ |
| strstr | utf8str | ✔ | ✔ |
| strok | utf8tok | ||
| strxfrm | utf8xfrm |
Fonctions fournies depuis l'en-tête C strings.h mais avec un préfixe utf8* au lieu du préfixe str* :
| chaînes.h | utf8.h | complet | Constexpr C++14 |
|---|---|---|---|
| strcasecmp | utf8casecmp | ✔ | |
| strncasecmp | utf8ncasecmp | ✔ | |
| strcasestr | utf8casestr | ✔ |
Fonctions fournies qui sont uniques à utf8.h :
| utf8.h | complet | Constexpr C++14 |
|---|---|---|
| point de code utf8 | ✔ | ✔ |
| point de code utf8r | ✔ | ✔ |
| taille utf8 | ✔ | ✔ |
| utf8size_lazy | ✔ | ✔ |
| utf8nsize_lazy | ✔ | ✔ |
| utf8valide | ✔ | ✔ |
| utf8nvalide | ✔ | ✔ |
| utf8makevalid | ✔ | |
| utf8codepointsize | ✔ | ✔ |
| point de code utf8cat | ✔ | |
| utf8isupper | ✔ | |
| utf8 est inférieur | ✔ | |
| utf8lwr | ||
| utf8upr | ||
| utf8lwrcodepoint | ✔ | |
| point de code utf8upr | ✔ |
#include "utf8.h" dans votre code !
Les plates-formes actuellement prises en charge sont Linux, macOS et Windows.
Les compilateurs actuellement pris en charge sont gcc, clang, cl.exe de MSVC et clang-cl.exe.
L'API utf8.h correspond autant que possible à l'API string.h de par sa conception. Il existe cependant quelques différences majeures.
utf8.h utilise char8_t* en C++ 20 au lieu de char*
Partout dans la documentation string.h ou strings.h où il fait référence aux « octets », j'ai changé cela en points de code utf8. Par exemple, utf8len renverra le nombre de points de code utf8 dans une chaîne utf8 – ce qui n'équivaut pas nécessairement au nombre d'octets.
int utf8casecmp ( const void * src1 , const void * src2 ); Renvoie moins de 0, 0, supérieur à 0 si src1 < src2 , src1 == src2 , src1 > src2 respectivement, insensible à la casse.
void * utf8cat ( void * dst , const void * src ); Ajoutez la chaîne utf8 src à la chaîne utf8 dst .
void * utf8chr ( const void * src , utf8_int32_t chr ); Recherchez la première correspondance du point de code utf8 chr dans la chaîne utf8 src .
int utf8cmp ( const void * src1 , const void * src2 ); Renvoie moins de 0, 0, supérieur à 0 si src1 < src2 ,
src1 == src2 , src1 > src2 respectivement.
void * utf8cpy ( void * dst , const void * src ); Copiez la chaîne utf8 src sur la mémoire allouée dans dst .
size_t utf8cspn ( const void * src , const void * reject ); Nombre de points de code utf8 dans la chaîne utf8 src composée entièrement
des points de code utf8 ne provenant pas de la chaîne utf8 reject .
void * utf8dup ( const void * src ); Dupliquez la chaîne utf8 src en obtenant sa taille, malloc un nouveau tampon
copier les données et les renvoyer. Ou 0 si malloc a échoué.
size_t utf8len ( const void * str ); Nombre de points de code utf8 dans la chaîne utf8 str ,
à l'exclusion de l'octet de fin nul.
size_t utf8nlen ( const void * str , size_t n ); Similaire à utf8len , sauf que seuls au plus n octets de src sont recherchés.
int utf8ncasecmp ( const void * src1 , const void * src2 , size_t n ); Renvoie moins de 0, 0, supérieur à 0 si src1 < src2 , src1 == src2 ,
src1 > src2 respectivement, insensible à la casse. Vérification au plus n
octets de chaque chaîne utf8.
void * utf8ncat ( void * dst , const void * src , size_t n ); Ajoutez la chaîne utf8 src à la chaîne utf8 dst ,
écrire au plus n+1 octets. Peut produire un utf8 invalide
chaîne si n tombe à mi-chemin d’un point de code utf8.
int utf8ncmp ( const void * src1 , const void * src2 , size_t n ); Renvoie moins de 0, 0, supérieur à 0 si src1 < src2 ,
src1 == src2 , src1 > src2 respectivement. Vérification au plus n
octets de chaque chaîne utf8.
void * utf8ncpy ( void * dst , const void * src , size_t n ); Copiez la chaîne utf8 src sur la mémoire allouée dans dst .
Copie au maximum n octets. Si n tombe à mi-chemin d'un point de code utf8, ou si dst n'a pas assez de place pour un terminateur nul, la chaîne finale sera raccourcie pour préserver la validité utf8.
void * utf8pbrk ( const void * str , const void * accept ); Localise la première occurrence dans la chaîne utf8 str de n'importe quel octet du
chaîne utf8 accept , ou 0 si aucune correspondance n'a été trouvée.
void * utf8rchr ( const void * src , utf8_int32_t chr ); Recherchez la dernière correspondance du point de code utf8 chr dans la chaîne utf8 src .
size_t utf8size ( const void * str ); Nombre d'octets dans la chaîne utf8 str ,
y compris l'octet de fin nul.
size_t utf8size_lazy ( const void * str ); Similaire à utf8size , sauf que l'octet de fin nul est exclu .
size_t utf8nsize_lazy ( const void * str , size_t n ); Similaire à utf8size , sauf que seuls au plus n octets de src sont recherchés et que l'octet de fin nul est exclu .
size_t utf8spn ( const void * src , const void * accept ); Nombre de points de code utf8 dans la chaîne utf8 src composée entièrement
des points de code utf8 de la chaîne utf8 accept .
void * utf8str ( const void * haystack , const void * needle ); La position de l' needle de la chaîne utf8 dans la haystack de la chaîne utf8.
void * utf8casestr ( const void * haystack , const void * needle ); La position de l' needle de la chaîne utf8 dans la haystack de la chaîne utf8, insensible à la casse.
void * utf8valid ( const void * str );Renvoie 0 en cas de succès, ou la position du codet utf8 invalide en cas d'échec.
void * utf8nvalid ( const void * str , size_t n ); Similaire à utf8valid , sauf que seuls au plus n octets de src sont recherchés.
int utf8makevalid ( void * str , utf8_int32_t replacement ); Renvoie 0 en cas de succès. Rend la str valide en remplaçant les séquences invalides par le point de code replacement de 1 octet.
void * utf8codepoint ( const void * str , utf8_int32_t * out_codepoint ); Définit out_codepoint sur le point de code utf8 actuel dans str et renvoie l'adresse du point de code utf8 suivant après celui actuel dans str .
void * utf8rcodepoint ( const void * str , utf8_int32_t * out_codepoint ); Définit out_codepoint sur le point de code utf8 actuel dans str et renvoie l'adresse du point de code utf8 précédent avant celui actuel dans str .
size_t utf8codepointsize ( utf8_int32_t chr );Renvoie la taille du point de code donné en octets.
void * utf8catcodepoint ( void * utf8_restrict str , utf8_int32_t chr , size_t n );Écrivez un point de code dans la chaîne donnée et renvoyez l'adresse à l'endroit suivant après le point de code écrit. Transmettez le nombre d'octets restants dans le tampon à n. S'il n'y a pas assez d'espace pour le point de code, cette fonction renvoie null.
int utf8islower ( utf8_int32_t chr );Renvoie 1 si le caractère donné est en minuscule, ou 0 s'il ne l'est pas.
int utf8isupper ( utf8_int32_t chr );Renvoie 1 si le caractère donné est en majuscule, ou 0 s'il ne l'est pas.
void utf8lwr ( void * utf8_restrict str );Transformez la chaîne donnée en tous les points de code minuscules.
void utf8upr ( void * utf8_restrict str );Transformez la chaîne donnée en tous les points de code majuscules.
utf8_int32_t utf8lwrcodepoint ( utf8_int32_t cp );Créez un point de code en minuscules si possible.
utf8_int32_t utf8uprcodepoint ( utf8_int32_t cp );Créez une majuscule de point de code si possible.
Diverses fonctions fournies effectueront des comparaisons insensibles à la casse ou transformeront les chaînes utf8 d'une casse à une autre. Compte tenu de l'immensité de l'Unicode et du manque de compréhension des auteurs au-delà des points de code latins quant à savoir si la casse signifie quelque chose, les catégories suivantes sont les seules qui seront vérifiées dans le code insensible à la casse :
Il s'agit d'un logiciel gratuit et sans contrainte publié dans le domaine public.
N'importe qui est libre de copier, modifier, publier, utiliser, compiler, vendre ou distribuer ce logiciel, soit sous forme de code source, soit sous forme de binaire compilé, à toute fin, commerciale ou non commerciale, et par tout moyen.
Dans les juridictions qui reconnaissent les lois sur le droit d'auteur, l'auteur ou les auteurs de ce logiciel consacrent tous les droits d'auteur sur le logiciel au domaine public. Nous effectuons cette dédicace au bénéfice du grand public et au détriment de nos héritiers et successeurs. Nous souhaitons que cette dédicace soit un acte manifeste d'abandon à perpétuité de tous les droits présents et futurs sur ce logiciel en vertu de la loi sur le droit d'auteur.
LE LOGICIEL EST FOURNI « EN L'ÉTAT », SANS GARANTIE D'AUCUNE SORTE, EXPRESSE OU IMPLICITE, Y COMPRIS MAIS SANS LIMITATION LES GARANTIES DE QUALITÉ MARCHANDE, D'ADAPTATION À UN USAGE PARTICULIER ET DE NON-VIOLATION. EN AUCUN CAS LES AUTEURS NE SERONT RESPONSABLES DE TOUTE RÉCLAMATION, DOMMAGES OU AUTRE RESPONSABILITÉ, QUE CE SOIT DANS UNE ACTION CONTRACTUELLE, DÉLIT OU AUTRE, DÉCOULANT DE, HORS OU EN RELATION AVEC LE LOGICIEL OU L'UTILISATION OU AUTRES AFFAIRES DANS LE LOGICIEL.
Pour plus d'informations, veuillez vous référer à http://unlicense.org/