Solusi satu header sederhana untuk mendukung string utf8 di C dan C++.
Fungsi disediakan dari string header C.h tetapi dengan awalan utf8* dan bukan awalan str*:
Dokumen fungsi API
string.h | utf8.h | menyelesaikan | Konteks C++14 |
---|---|---|---|
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 | ✔ | ✔ |
strchr | utf8rchr | ✔ | ✔ |
strsep | utf8sep | ||
strspn | utf8spn | ✔ | ✔ |
strstr | utf8str | ✔ | ✔ |
strtok | utf8tok | ||
strxfrm | utf8xfrm |
Fungsi disediakan dari header C strings.h tetapi dengan awalan utf8* dan bukan awalan str*:
string.h | utf8.h | menyelesaikan | Konteks C++14 |
---|---|---|---|
strcasecmp | utf8casecmp | ✔ | |
strncasecmp | utf8ncasecmp | ✔ | |
strcasestr | utf8casestr | ✔ |
Fungsi unik yang disediakan untuk utf8.h:
utf8.h | menyelesaikan | Konteks C++14 |
---|---|---|
titik kode utf8 | ✔ | ✔ |
titik kode utf8r | ✔ | ✔ |
utf8size | ✔ | ✔ |
utf8size_lazy | ✔ | ✔ |
utf8nsize_lazy | ✔ | ✔ |
utf8valid | ✔ | ✔ |
utf8nvalid | ✔ | ✔ |
utf8makevalid | ✔ | |
utf8codepointsize | ✔ | ✔ |
titik kode utf8cat | ✔ | |
utf8isupper | ✔ | |
utf8lebih rendah | ✔ | |
utf8lwr | ||
utf8upr | ||
utf8lwrcodepoint | ✔ | |
utf8uprcodepoint | ✔ |
Cukup #include "utf8.h"
dalam kode Anda!
Platform yang didukung saat ini adalah Linux, macOS dan Windows.
Kompiler yang didukung saat ini adalah gcc, clang, cl.exe MSVC, dan clang-cl.exe.
API utf8.h sebisa mungkin cocok dengan API string.h berdasarkan desainnya. Namun ada beberapa perbedaan besar.
utf8.h menggunakan char8_t* di C++ 20 bukan char*
Di mana saja dalam dokumentasi string.h atau strings.h yang mengacu pada 'byte', saya telah mengubahnya menjadi titik kode utf8. Misalnya, utf8len akan mengembalikan jumlah titik kode utf8 dalam string utf8 - yang tidak selalu sama dengan jumlah byte.
int utf8casecmp ( const void * src1 , const void * src2 );
Kembalikan kurang dari 0, 0, lebih besar dari 0 jika src1 < src2
, src1 == src2
, src1 > src2
masing-masing, tidak peka huruf besar-kecil.
void * utf8cat ( void * dst , const void * src );
Tambahkan string utf8 src
ke string utf8 dst
.
void * utf8chr ( const void * src , utf8_int32_t chr );
Temukan kecocokan pertama dari titik kode utf8 chr
dalam string utf8 src
.
int utf8cmp ( const void * src1 , const void * src2 );
Kembalikan kurang dari 0, 0, lebih besar dari 0 jika src1 < src2
,
src1 == src2
, src1 > src2
masing-masing.
void * utf8cpy ( void * dst , const void * src );
Salin string utf8 src
ke memori yang dialokasikan di dst
.
size_t utf8cspn ( const void * src , const void * reject );
Jumlah titik kode utf8 dalam string utf8 src
yang seluruhnya terdiri
titik kode utf8 bukan dari string utf8 reject
.
void * utf8dup ( const void * src );
Gandakan string utf8 src
dengan mendapatkan ukurannya, malloc
dengan buffer baru
menyalin data, dan mengembalikannya. Atau 0 jika malloc
gagal.
size_t utf8len ( const void * str );
Jumlah titik kode utf8 dalam string utf8 str
,
tidak termasuk byte pengakhiran nol.
size_t utf8nlen ( const void * str , size_t n );
Mirip dengan utf8len
, hanya saja paling banyak n
byte src
yang terlihat.
int utf8ncasecmp ( const void * src1 , const void * src2 , size_t n );
Kembalikan kurang dari 0, 0, lebih besar dari 0 jika src1 < src2
, src1 == src2
,
src1 > src2
masing-masing, tidak peka huruf besar-kecil. Memeriksa paling banyak n
byte dari setiap string utf8.
void * utf8ncat ( void * dst , const void * src , size_t n );
Tambahkan string utf8 src
ke string utf8 dst
,
menulis paling banyak n+1
byte. Dapat menghasilkan utf8 yang tidak valid
string jika n
gagal di tengah titik kode utf8.
int utf8ncmp ( const void * src1 , const void * src2 , size_t n );
Kembalikan kurang dari 0, 0, lebih besar dari 0 jika src1 < src2
,
src1 == src2
, src1 > src2
masing-masing. Memeriksa paling banyak n
byte dari setiap string utf8.
void * utf8ncpy ( void * dst , const void * src , size_t n );
Salin string utf8 src
ke memori yang dialokasikan di dst
.
Menyalin paling banyak n
byte. Jika n
jatuh di tengah-tengah titik kode utf8, atau jika dst
tidak memiliki cukup ruang untuk terminator nol, string terakhir akan dipotong untuk menjaga validitas utf8.
void * utf8pbrk ( const void * str , const void * accept );
Menemukan kemunculan pertama dalam string utf8 str
dari setiap byte di
string utf8 accept
, atau 0 jika tidak ditemukan kecocokan.
void * utf8rchr ( const void * src , utf8_int32_t chr );
Temukan kecocokan terakhir dari titik kode utf8 chr
dalam string utf8 src
.
size_t utf8size ( const void * str );
Jumlah byte dalam string utf8 str
,
termasuk byte pengakhiran nol.
size_t utf8size_lazy ( const void * str );
Mirip dengan utf8size
, kecuali bahwa byte pengakhiran null dikecualikan .
size_t utf8nsize_lazy ( const void * str , size_t n );
Mirip dengan utf8size
, hanya saja paling banyak hanya n
byte src
yang dilihat dan byte pengakhiran null dikecualikan .
size_t utf8spn ( const void * src , const void * accept );
Jumlah titik kode utf8 dalam string utf8 src
yang seluruhnya terdiri
titik kode utf8 dari string utf8 accept
.
void * utf8str ( const void * haystack , const void * needle );
Posisi needle
senar utf8 di haystack
senar utf8 .
void * utf8casestr ( const void * haystack , const void * needle );
Posisi needle
senar utf8 di haystack
senar utf8, tidak peka huruf besar-kecil.
void * utf8valid ( const void * str );
Kembalikan 0 jika berhasil, atau posisi titik kode utf8 tidak valid jika gagal.
void * utf8nvalid ( const void * str , size_t n );
Mirip dengan utf8valid
, hanya saja paling banyak n
byte src
yang terlihat.
int utf8makevalid ( void * str , utf8_int32_t replacement );
Kembalikan 0 jika berhasil. Menjadikan str
valid dengan mengganti urutan yang tidak valid dengan titik kode replacement
1 byte.
void * utf8codepoint ( const void * str , utf8_int32_t * out_codepoint );
Menyetel out_codepoint ke titik kode utf8 saat ini di str
, dan mengembalikan alamat titik kode utf8 berikutnya setelah yang sekarang di str
.
void * utf8rcodepoint ( const void * str , utf8_int32_t * out_codepoint );
Menyetel out_codepoint ke titik kode utf8 saat ini di str
, dan mengembalikan alamat titik kode utf8 sebelumnya sebelum alamat saat ini di str
.
size_t utf8codepointsize ( utf8_int32_t chr );
Mengembalikan ukuran titik kode tertentu dalam byte.
void * utf8catcodepoint ( void * utf8_restrict str , utf8_int32_t chr , size_t n );
Tulis titik kode ke string yang diberikan, dan kembalikan alamatnya ke tempat berikutnya setelah titik kode tertulis. Berikan berapa byte yang tersisa di buffer ke n. Jika tidak ada cukup ruang untuk titik kode, fungsi ini akan mengembalikan null.
int utf8islower ( utf8_int32_t chr );
Mengembalikan 1 jika karakter yang diberikan adalah huruf kecil, atau 0 jika bukan.
int utf8isupper ( utf8_int32_t chr );
Mengembalikan 1 jika karakter yang diberikan adalah huruf besar, atau 0 jika bukan.
void utf8lwr ( void * utf8_restrict str );
Ubah string yang diberikan menjadi semua titik kode huruf kecil.
void utf8upr ( void * utf8_restrict str );
Ubah string yang diberikan menjadi semua titik kode huruf besar.
utf8_int32_t utf8lwrcodepoint ( utf8_int32_t cp );
Buat titik kode menjadi huruf kecil jika memungkinkan.
utf8_int32_t utf8uprcodepoint ( utf8_int32_t cp );
Buat titik kode menjadi huruf besar jika memungkinkan.
Berbagai fungsi yang disediakan akan melakukan perbandingan case-sensitive, atau mengubah string utf8 dari satu case ke case lainnya. Mengingat luasnya unicode, dan kurangnya pemahaman penulis di luar titik kode latin mengenai apakah huruf besar/kecil memiliki arti, kategori berikut adalah satu-satunya kategori yang akan diperiksa jika kode tidak peka huruf besar-kecil:
Ini adalah perangkat lunak gratis dan tidak terbebani yang dirilis ke domain publik.
Siapa pun bebas menyalin, memodifikasi, menerbitkan, menggunakan, menyusun, menjual, atau mendistribusikan perangkat lunak ini, baik dalam bentuk kode sumber atau sebagai biner terkompilasi, untuk tujuan apa pun, komersial atau non-komersial, dan dengan cara apa pun.
Di wilayah hukum yang mengakui undang-undang hak cipta, pembuat perangkat lunak ini mendedikasikan setiap dan seluruh kepentingan hak cipta dalam perangkat lunak tersebut ke domain publik. Pengabdian ini kami lakukan demi kemaslahatan masyarakat luas dan merugikan ahli waris serta penerus kami. Kami bermaksud dedikasi ini menjadi tindakan pelepasan yang terang-terangan untuk selamanya atas semua hak saat ini dan di masa depan atas perangkat lunak ini berdasarkan undang-undang hak cipta.
PERANGKAT LUNAK INI DISEDIAKAN "APA ADANYA", TANPA JAMINAN APA PUN, TERSURAT MAUPUN TERSIRAT, TERMASUK NAMUN TIDAK TERBATAS PADA JAMINAN KELAYAKAN UNTUK DIPERDAGANGKAN, KESESUAIAN UNTUK TUJUAN TERTENTU, DAN TIDAK ADA PELANGGARAN. DALAM KEADAAN APA PUN PENULIS TIDAK BERTANGGUNG JAWAB ATAS KLAIM, KERUSAKAN ATAU TANGGUNG JAWAB LAINNYA, BAIK DALAM TINDAKAN KONTRAK, HUKUM ATAU LAINNYA, YANG TIMBUL DARI, DARI ATAU SEHUBUNGAN DENGAN PERANGKAT LUNAK ATAU PENGGUNAAN ATAU HAL-HAL LAIN DALAM PERANGKAT LUNAK.
Untuk informasi lebih lanjut, silakan merujuk ke http://unlicense.org/