一個簡單的單標頭解決方案,支援 C 和 C++ 中的 utf8 字串。
從 C 標頭 string.h 提供的函數,但使用 utf8* 前綴而不是 str* 前綴:
API函數文檔
| 字串.h | utf8.h | 完全的 | C++14 常數表達式 |
|---|---|---|---|
| 字串貓 | utf8cat | ✔ | |
| 字串 | utf8字符 | ✔ | ✔ |
| STRCMP | utf8cmp | ✔ | ✔ |
| 斯特科爾 | utf8coll | ||
| 結構體 | utf8cpy | ✔ | |
| 字串 | utf8cspn | ✔ | ✔ |
| strdup | utf8dup | ✔ | |
| 斯特弗里 | utf8fry | ||
| 斯特倫 | utf8長度 | ✔ | ✔ |
| 斯特恩倫 | utf8n長度 | ✔ | ✔ |
| 字串貓 | utf8ncat | ✔ | |
| STRNCMP | UTF8NCMP | ✔ | ✔ |
| 結構體 | utf8ncpy | ✔ | |
| 史特倫達普 | utf8ndup | ✔ | |
| 史特普布克 | utf8pbrk | ✔ | ✔ |
| 字串 | utf8rchr | ✔ | ✔ |
| 史特塞普 | utf8sep | ||
| 字串 | UTF8SPN | ✔ | ✔ |
| 斯特斯特 | utf8str | ✔ | ✔ |
| 斯特托克 | utf8tok | ||
| 字串 | utf8xfrm |
從 C 標頭 strings.h 提供的函數,但使用 utf8* 前綴而不是 str* 前綴:
| 字串.h | utf8.h | 完全的 | C++14 常數表達式 |
|---|---|---|---|
| strcasecmp | utf8casecmp | ✔ | |
| 斯特恩卡西姆普 | utf8ncasecmp | ✔ | |
| strcasestr | utf8casestr | ✔ |
提供的 utf8.h 獨有的函數:
| utf8.h | 完全的 | C++14 常數表達式 |
|---|---|---|
| utf8代碼點 | ✔ | ✔ |
| utf8r代碼點 | ✔ | ✔ |
| UTF8大小 | ✔ | ✔ |
| utf8size_lazy | ✔ | ✔ |
| utf8nsize_lazy | ✔ | ✔ |
| utf8有效 | ✔ | ✔ |
| utf8無效 | ✔ | ✔ |
| utf8makevalid | ✔ | |
| utf8碼點大小 | ✔ | ✔ |
| utf8cat代碼點 | ✔ | |
| utf8isupper | ✔ | |
| utf8islower | ✔ | |
| utf8lwr | ||
| utf8upr | ||
| utf8lwr代碼點 | ✔ | |
| utf8upr碼點 | ✔ |
只需在程式碼中#include "utf8.h"即可!
目前支援的平台有 Linux、macOS 和 Windows。
目前支援的編譯器有 gcc、clang、MSVC 的 cl.exe 和 clang-cl.exe。
utf8.h API 在設計上盡可能與 string.h API 相符。但還是有一些主要差異。
utf8.h 在 C++ 20 中使用 char8_t* 而非 char*
在 string.h 或 strings.h 文件中引用“位元組”的任何位置,我已將其更改為 utf8 代碼點。例如,utf8len 將傳回 utf8 字串中 utf8 代碼點的數量 - 這不一定等於位元組數。
int utf8casecmp ( const void * src1 , const void * src2 );如果src1 < src2 、 src1 == src2 、 src1 > src2分別回傳小於 0、0、大於 0,則不區分大小寫。
void * utf8cat ( void * dst , const void * src );將 utf8 字串src附加到 utf8 字串dst上。
void * utf8chr ( const void * src , utf8_int32_t chr );在 utf8 字串src中尋找 utf8 代碼點chr的第一個符合項目。
int utf8cmp ( const void * src1 , const void * src2 );如果src1 < src2則傳回小於 0、0、大於 0 的值,
分別是src1 == src2 、 src1 > src2 。
void * utf8cpy ( void * dst , const void * src );將 utf8 字串src複製到dst中分配的記憶體中。
size_t utf8cspn ( const void * src , const void * reject );完整包含的 utf8 字串src中 utf8 碼點的數量
的 utf8 代碼點不是來自 utf8 字串reject 。
void * utf8dup ( const void * src );透過取得其大小來複製 utf8 字串src , malloc一個新的緩衝區
複製資料並返回。如果malloc失敗則回傳 0。
size_t utf8len ( const void * str ); utf8 字串str中 utf8 代碼點的數量,
不包括空終止位元組。
size_t utf8nlen ( const void * str , size_t n );與utf8len類似,不同之處在於最多只查找src的n位元組。
int utf8ncasecmp ( const void * src1 , const void * src2 , size_t n );如果src1 < src2 、 src1 == src2 ,則傳回小於 0、0、大於 0 的值,
分別為src1 > src2 ,不區分大小寫。最多檢查n
每個 utf8 字串的位元組數。
void * utf8ncat ( void * dst , const void * src , size_t n );將 utf8 字串src附加到 utf8 字串dst上,
最多寫入n+1位元組。可能會產生無效的 utf8
如果n落在 utf8 代碼點的中間,則為字串。
int utf8ncmp ( const void * src1 , const void * src2 , size_t n );如果src1 < src2則傳回小於 0、0、大於 0 的值,
分別是src1 == src2 、 src1 > src2 。最多檢查n
每個 utf8 字串的位元組數。
void * utf8ncpy ( void * dst , const void * src , size_t n );將 utf8 字串src複製到dst中分配的記憶體中。
最多複製n組。如果n落在 utf8 碼點的中間,或者dst沒有足夠的空間容納空終止符,則最終字串將被截斷以保留 utf8 有效性。
void * utf8pbrk ( const void * str , const void * accept );定位 utf8 字串str中任意位元組的第一次出現
utf8 字串accept ,如果沒有找到符合則傳回 0。
void * utf8rchr ( const void * src , utf8_int32_t chr );在 utf8 字串src中尋找 utf8 代碼點chr的最後一個符合項目。
size_t utf8size ( const void * str ); utf8 字串str中的位元組數,
包括空終止位元組。
size_t utf8size_lazy ( const void * str );與utf8size類似,但不包括空終止位元組。
size_t utf8nsize_lazy ( const void * str , size_t n );與utf8size類似,只不過最多只尋找src的n字節,並且排除空終止位元組。
size_t utf8spn ( const void * src , const void * accept );完整包含的 utf8 字串src中 utf8 碼點的數量
來自 utf8 字串的 utf8 代碼點accept 。
void * utf8str ( const void * haystack , const void * needle ); utf8字串needle在utf8字串haystack中的位置。
void * utf8casestr ( const void * haystack , const void * needle ); utf8字串needle在utf8字串haystack中的位置,不區分大小寫。
void * utf8valid ( const void * str );成功時傳回 0,失敗時傳回無效 utf8 碼點的位置。
void * utf8nvalid ( const void * str , size_t n );與utf8valid類似,不同之處在於最多只查找src的n位元組。
int utf8makevalid ( void * str , utf8_int32_t replacement );成功返回0。透過以 1 個位元組replacement代碼點替換無效序列,使str有效。
void * utf8codepoint ( const void * str , utf8_int32_t * out_codepoint );將 out_codepoint 設定為str中的目前 utf8 碼點,並傳回str中目前代碼點之後的下一個 utf8 碼點的位址。
void * utf8rcodepoint ( const void * str , utf8_int32_t * out_codepoint );將 out_codepoint 設定為str中的目前 utf8 碼點,並傳回str中目前代碼點之前的上一個 utf8 碼點的位址。
size_t utf8codepointsize ( utf8_int32_t chr );傳回給定代碼點的大小(以位元組為單位)。
void * utf8catcodepoint ( void * utf8_restrict str , utf8_int32_t chr , size_t n );將程式碼點寫入給定字串,並將位址傳回寫入的程式碼點之後的下一個位置。將緩衝區中剩餘的位元組數傳遞給 n。如果沒有足夠的空間容納程式碼點,則此函數傳回 null。
int utf8islower ( utf8_int32_t chr );如果給定字元為小寫,則傳回 1,否則傳回 0。
int utf8isupper ( utf8_int32_t chr );如果給定字元為大寫,則傳回 1,否則傳回 0。
void utf8lwr ( void * utf8_restrict str );將給定字串轉換為所有小寫程式碼點。
void utf8upr ( void * utf8_restrict str );將給定字串轉換為全部大寫的程式碼點。
utf8_int32_t utf8lwrcodepoint ( utf8_int32_t cp );如果可能的話,將程式碼點設為小寫。
utf8_int32_t utf8uprcodepoint ( utf8_int32_t cp );如果可能的話,將程式碼點設為大寫。
提供的各種函數將進行不區分大小寫的比較,或將 utf8 字串從一種大小寫轉換為另一種大小寫。鑑於 unicode 的龐大性,以及作者對拉丁代碼點之外的大小寫是否有意義缺乏理解,以下類別是在不區分大小寫的代碼中唯一將被檢查的類別:
這是發佈到公共領域的免費且不受阻礙的軟體。
任何人都可以為任何目的(商業或非商業)以任何方式以原始程式碼形式或編譯的二進位檔案自由複製、修改、發布、使用、編譯、銷售或散佈本軟體。
在承認版權法的司法管轄區,本軟體的作者將軟體中的任何及所有版權權益奉獻給公共領域。我們做出這種奉獻是為了廣大公眾的利益,而不是為了我們的繼承人和繼任者的利益。我們希望這種奉獻成為永久放棄版權法規定的本軟體所有當前和未來權利的公開行為。
本軟體以「現況」提供,不提供任何明示或暗示的保證,包括但不限於適銷性、特定用途的適用性和不侵權的保證。在任何情況下,作者均不對因本軟體或本軟體的使用或其他交易而產生或與之相關的任何索賠、損害或其他責任負責,無論是合約行為、侵權行為或其他行為。
欲了解更多信息,請參閱http://unlicense.org/