C中的UTF8处理

我对UTF8有基本的了解:代码点具有可变长度,因此“字符”可以是8位,16位甚至更长。

我想知道的是,如果C语言中有一些示例代码,库等与UTF8字符串类似,就像CEg中的标准库那样告诉字符串的长度等等。

谢谢,

GNU确实有一个名为libunistring的Unicode字符串库,但它不像ICU那样处理任何事情。

例如,GNU库甚至不允许您访问排序规则,这是所有字符串比较的基础。 相比之下,ICU确实如此。 ICU没有出现GNU没有出现的另一件事是Unicode正则表达式。 为此,您可能希望使用Phil Hazel用于C的优秀PCRE库 ,可以使用UTF-8支持进行编译。

但是,GNU库可能足以满足您的需求。 我不太喜欢它的API。 很乱。 如果你喜欢C编程,你可以尝试Go编程语言 ,它具有出色的Unicode支持。 这是一种新语言,但小而干净,使用起来很有趣。

另一方面,主要的解释语言–Perl,Python和Ruby–都对Unicode有不同的支持,这比你在C中所获得的要好。其中,Perl的Unicode支持是最发达和最强大的。

请记住:仅支持更多角色是不够的。 没有与它们一起使用的规则,您就没有Unicode。 最多,您可能拥有ISO 10646:大字符保留但没有规则。 我的口头禅是“Unicode不只是更多的字符; 它是更多的角色加上一大堆处理它们的规则。“

处理Unicode的最重要的库是IBM的ICU 。

但是,如果您需要做的只是确定UTF-8编码字符串中的代码点数,请计算值在\x01\x7F之间或\xC2\xFF之间的字符数。

如果您对不分配内存并使用堆栈的库感兴趣,可以尝试使用utf8rewind 。