一种简单的单标头解决方案,支持 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 字符串reject的 utf8 代码点。
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/