Eine einfache One-Header-Lösung zur Unterstützung von utf8-Strings in C und C++.
Vom C-Header string.h bereitgestellte Funktionen, jedoch mit einem utf8*-Präfix anstelle des str*-Präfixes:
API-Funktionsdokumente
string.h | utf8.h | vollständig | C++14 constexpr |
---|---|---|---|
strcat | utf8cat | ✔ | |
strchr | utf8chr | ✔ | ✔ |
strcmp | utf8cmp | ✔ | ✔ |
strcoll | utf8coll | ||
strcpy | utf8cpy | ✔ | |
strcspn | utf8cspn | ✔ | ✔ |
strdup | utf8dup | ✔ | |
strfry | utf8fry | ||
strlen | utf8len | ✔ | ✔ |
strnlen | utf8nlen | ✔ | ✔ |
strncat | utf8ncat | ✔ | |
strncmp | utf8ncmp | ✔ | ✔ |
strncpy | utf8ncpy | ✔ | |
strndup | utf8ndup | ✔ | |
strpbrk | utf8pbrk | ✔ | ✔ |
strrchr | utf8rchr | ✔ | ✔ |
strsep | utf8sep | ||
strspn | utf8spn | ✔ | ✔ |
strstr | utf8str | ✔ | ✔ |
strtok | utf8tok | ||
strxfrm | utf8xfrm |
Vom C-Header strings.h bereitgestellte Funktionen, jedoch mit einem utf8*-Präfix anstelle des str*-Präfixes:
Saiten.h | utf8.h | vollständig | C++14 constexpr |
---|---|---|---|
strcasecmp | utf8casecmp | ✔ | |
strncasecmp | utf8ncasecmp | ✔ | |
strcasestr | utf8casestr | ✔ |
Es stehen Funktionen zur Verfügung, die nur für utf8.h gelten:
utf8.h | vollständig | C++14 constexpr |
---|---|---|
utf8codepoint | ✔ | ✔ |
utf8rcodepoint | ✔ | ✔ |
utf8size | ✔ | ✔ |
utf8size_lazy | ✔ | ✔ |
utf8nsize_lazy | ✔ | ✔ |
utf8valid | ✔ | ✔ |
utf8nvalid | ✔ | ✔ |
utf8makevalid | ✔ | |
utf8codepointsize | ✔ | ✔ |
utf8catcodepoint | ✔ | |
utf8isupper | ✔ | |
utf8islower | ✔ | |
utf8lwr | ||
utf8upr | ||
utf8lwrcodepoint | ✔ | |
utf8uprcodepoint | ✔ |
#include "utf8.h"
in Ihren Code ein!
Die aktuell unterstützten Plattformen sind Linux, macOS und Windows.
Die aktuell unterstützten Compiler sind gcc, clang, cl.exe von MSVC und clang-cl.exe.
Die utf8.h-API stimmt vom Design her so weit wie möglich mit der string.h-API überein. Es gibt jedoch einige große Unterschiede.
utf8.h verwendet char8_t* in C++ 20 anstelle von char*
Überall in der string.h- oder strings.h-Dokumentation, wo es sich um „Bytes“ handelt, habe ich das in utf8-Codepunkte geändert. Beispielsweise gibt utf8len die Anzahl der utf8-Codepunkte in einem utf8-String zurück – was nicht unbedingt der Anzahl der Bytes entspricht.
int utf8casecmp ( const void * src1 , const void * src2 );
Geben Sie kleiner als 0, 0 oder größer als 0 zurück, wenn src1 < src2
, src1 == src2
, src1 > src2
, wobei die Groß- und Kleinschreibung nicht berücksichtigt wird.
void * utf8cat ( void * dst , const void * src );
Hängen Sie die UTF8-Zeichenfolge src
an die UTF8-Zeichenfolge dst
.
void * utf8chr ( const void * src , utf8_int32_t chr );
Suchen Sie die erste Übereinstimmung des utf8-Codepunkts chr
im utf8-String src
.
int utf8cmp ( const void * src1 , const void * src2 );
Gibt kleiner als 0, 0, größer als 0 zurück, wenn src1 < src2
,
src1 == src2
, src1 > src2
bzw.
void * utf8cpy ( void * dst , const void * src );
Kopieren Sie die utf8-Zeichenfolge src
in den in dst
zugewiesenen Speicher.
size_t utf8cspn ( const void * src , const void * reject );
Anzahl der UTF8-Codepunkte in der UTF8-Zeichenfolge src
, die vollständig besteht
von utf8-Codepunkten, die nicht aus der utf8-Zeichenfolge reject
stammen.
void * utf8dup ( const void * src );
Duplizieren Sie den utf8-String src
, indem Sie seine Größe ermitteln und einen neuen Puffer malloc
Kopieren Sie die Daten und geben Sie sie zurück. Oder 0, wenn malloc
fehlgeschlagen ist.
size_t utf8len ( const void * str );
Anzahl der UTF8-Codepunkte in der UTF8-Zeichenfolge str
,
mit Ausnahme des Null-Abschlussbytes.
size_t utf8nlen ( const void * str , size_t n );
Ähnlich wie utf8len
, außer dass nur höchstens n
Bytes von src
durchsucht werden.
int utf8ncasecmp ( const void * src1 , const void * src2 , size_t n );
Gibt kleiner als 0, 0, größer als 0 zurück, wenn src1 < src2
, src1 == src2
,
src1 > src2
bzw. Groß- und Kleinschreibung wird nicht beachtet. Überprüfung höchstens n
Bytes jeder UTF8-Zeichenfolge.
void * utf8ncat ( void * dst , const void * src , size_t n );
Hängen Sie die UTF8-Zeichenfolge src
an die UTF8-Zeichenfolge dst
.
Schreiben von höchstens n+1
Bytes. Kann ein ungültiges utf8 erzeugen
Zeichenfolge, wenn n
auf halbem Weg durch einen UTF8-Codepunkt fällt.
int utf8ncmp ( const void * src1 , const void * src2 , size_t n );
Gibt kleiner als 0, 0, größer als 0 zurück, wenn src1 < src2
,
src1 == src2
, src1 > src2
bzw. Überprüfung höchstens n
Bytes jeder UTF8-Zeichenfolge.
void * utf8ncpy ( void * dst , const void * src , size_t n );
Kopieren Sie die utf8-Zeichenfolge src
in den in dst
zugewiesenen Speicher.
Kopiert höchstens n
Bytes. Wenn n
mitten durch einen utf8-Codepunkt fällt oder wenn dst
nicht genügend Platz für einen Null-Terminator hat, wird die letzte Zeichenfolge abgeschnitten, um die utf8-Gültigkeit zu bewahren.
void * utf8pbrk ( const void * str , const void * accept );
Sucht das erste Vorkommen eines beliebigen Bytes in der UTF8-Zeichenfolge str
utf8-Zeichenfolge accept
oder 0, wenn keine Übereinstimmung gefunden wurde.
void * utf8rchr ( const void * src , utf8_int32_t chr );
Suchen Sie die letzte Übereinstimmung des utf8-Codepunkts chr
im utf8-String src
.
size_t utf8size ( const void * str );
Anzahl der Bytes im utf8-String str
,
einschließlich des Null-Abschlussbytes.
size_t utf8size_lazy ( const void * str );
Ähnlich wie utf8size
, außer dass das Null-Abschlussbyte ausgeschlossen ist.
size_t utf8nsize_lazy ( const void * str , size_t n );
Ähnlich wie utf8size
, außer dass nur höchstens n
Bytes von src
durchsucht werden und das Null-Abschlussbyte ausgeschlossen ist.
size_t utf8spn ( const void * src , const void * accept );
Anzahl der UTF8-Codepunkte in der UTF8-Zeichenfolge src
, die vollständig besteht
von utf8-Codepunkten aus der utf8-Zeichenfolge accept
.
void * utf8str ( const void * haystack , const void * needle );
Die Position der UTF8-String- needle
im UTF8-String- haystack
.
void * utf8casestr ( const void * haystack , const void * needle );
Die Position der UTF8-String needle
im UTF8-String- haystack
, Groß- und Kleinschreibung wird nicht beachtet.
void * utf8valid ( const void * str );
Geben Sie bei Erfolg 0 oder bei einem Fehler die Position des ungültigen utf8-Codepunkts zurück.
void * utf8nvalid ( const void * str , size_t n );
Ähnlich wie utf8valid
, außer dass nur höchstens n
Bytes von src
durchsucht werden.
int utf8makevalid ( void * str , utf8_int32_t replacement );
Bei Erfolg 0 zurückgeben. Macht die str
gültig, indem ungültige Sequenzen durch den 1-Byte- replacement
ersetzt werden.
void * utf8codepoint ( const void * str , utf8_int32_t * out_codepoint );
Setzt out_codepoint auf den aktuellen utf8-Codepunkt in str
und gibt die Adresse des nächsten utf8-Codepunkts nach dem aktuellen in str
zurück.
void * utf8rcodepoint ( const void * str , utf8_int32_t * out_codepoint );
Setzt out_codepoint auf den aktuellen utf8-Codepunkt in str
und gibt die Adresse des vorherigen utf8-Codepunkts vor dem aktuellen in str
zurück.
size_t utf8codepointsize ( utf8_int32_t chr );
Gibt die Größe des angegebenen Codepunkts in Bytes zurück.
void * utf8catcodepoint ( void * utf8_restrict str , utf8_int32_t chr , size_t n );
Schreiben Sie einen Codepunkt in die angegebene Zeichenfolge und geben Sie die Adresse an die nächste Stelle nach dem geschriebenen Codepunkt zurück. Übergeben Sie die Anzahl der im Puffer verbleibenden Bytes an n. Wenn nicht genügend Platz für den Codepunkt vorhanden ist, gibt diese Funktion null zurück.
int utf8islower ( utf8_int32_t chr );
Gibt 1 zurück, wenn das angegebene Zeichen Kleinbuchstaben ist, oder 0, wenn dies nicht der Fall ist.
int utf8isupper ( utf8_int32_t chr );
Gibt 1 zurück, wenn das angegebene Zeichen ein Großbuchstabe ist, oder 0, wenn dies nicht der Fall ist.
void utf8lwr ( void * utf8_restrict str );
Wandeln Sie die angegebene Zeichenfolge in alle Codepunkte in Kleinbuchstaben um.
void utf8upr ( void * utf8_restrict str );
Wandeln Sie die angegebene Zeichenfolge in alle Codepunkte in Großbuchstaben um.
utf8_int32_t utf8lwrcodepoint ( utf8_int32_t cp );
Schreiben Sie den Codepunkt nach Möglichkeit in Kleinbuchstaben.
utf8_int32_t utf8uprcodepoint ( utf8_int32_t cp );
Geben Sie den Codepunkt nach Möglichkeit in Großbuchstaben ein.
Verschiedene bereitgestellte Funktionen führen Vergleiche ohne Berücksichtigung der Groß- und Kleinschreibung durch oder wandeln UTF8-Zeichenfolgen von einer Groß-/Kleinschreibung in eine andere um. Angesichts der Weitläufigkeit von Unicode und des mangelnden Verständnisses des Autors über lateinische Codepunkte hinaus, ob die Groß-/Kleinschreibung etwas bedeutet, sind die folgenden Kategorien die einzigen, die bei Code, bei dem die Groß-/Kleinschreibung nicht beachtet wird, überprüft werden:
Hierbei handelt es sich um kostenlose und unbelastete Software, die der Öffentlichkeit zugänglich gemacht wird.
Es steht jedem frei, diese Software zu kopieren, zu ändern, zu veröffentlichen, zu verwenden, zu kompilieren, zu verkaufen oder zu verteilen, entweder in Quellcodeform oder als kompilierte Binärdatei, für jeden Zweck, kommerziell oder nichtkommerziell, und mit allen Mitteln.
In Gerichtsbarkeiten, die Urheberrechtsgesetze anerkennen, überlassen der Autor oder die Autoren dieser Software sämtliche Urheberrechtsansprüche an der Software der öffentlichen Domäne. Diese Widmung leisten wir zum Wohle der Allgemeinheit und zum Nachteil unserer Erben und Nachfolger. Wir beabsichtigen, dass diese Widmung ein offener Akt des dauerhaften Verzichts auf alle gegenwärtigen und zukünftigen Rechte an dieser Software gemäß dem Urheberrecht ist.
DIE SOFTWARE WIRD „WIE BESEHEN“ ZUR VERFÜGUNG GESTELLT, OHNE JEGLICHE AUSDRÜCKLICHE ODER STILLSCHWEIGENDE GEWÄHRLEISTUNG, EINSCHLIESSLICH, ABER NICHT BESCHRÄNKT AUF DIE GEWÄHRLEISTUNG DER MARKTGÄNGIGKEIT, EIGNUNG FÜR EINEN BESTIMMTEN ZWECK UND NICHTVERLETZUNG. IN KEINEM FALL SIND DIE AUTOREN HAFTBAR FÜR ANSPRÜCHE, SCHÄDEN ODER ANDERE HAFTUNG, WEDER AUS EINER VERTRAGSKlage, unerlaubter Handlung noch aus anderen Gründen, DIE AUS, AUS ODER IN VERBINDUNG MIT DER SOFTWARE ODER DER NUTZUNG ODER ANDEREN HANDELN MIT DER SOFTWARE ENTSTEHEN.
Weitere Informationen finden Sie unter http://unlicense.org/