C库将unicode代码点转换为UTF8?

我必须经历一些文本并根据字符模式编写UTF8输出。 我认为如果我可以使用代码点并将其转换为UTF8将会很容易。 我一直在阅读有关unicode和UTF8的内容,但无法找到一个好的解决方案。 任何帮助将不胜感激。

将Unicode代码点转换为UTF-8是如此微不足道,以至于调用库可能需要更多代码,而不仅仅是自己执行:

if (c<0x80) *b++=c; else if (c<0x800) *b++=192+c/64, *b++=128+c%64; else if (c-0xd800u<0x800) goto error; else if (c<0x10000) *b++=224+c/4096, *b++=128+c/64%64, *b++=128+c%64; else if (c<0x110000) *b++=240+c/262144, *b++=128+c/4096%64, *b++=128+c/64%64, *b++=128+c%64; else goto error; 

另外,自己动手意味着你可以将api调整到你需要的工作类型(一次一个字符?或长字符串?)如果你知道你的输入是有效的Unicode标量值,你可以删除错误情况。

另一个方向更难以纠正。 我建议使用有限自动机方法,而不是典型的位算术循环,有时将无效序列解码为真实字符的别名(这非常危险并且可能导致安全问题)。

编辑:即使你最终选择了图书馆,我认为你应该先尝试自己编写,或者至少要认真学习UTF-8规范,然后再继续学习。 很多糟糕的设计都可以将UTF-8视为一个黑盒子,因为它不是一个黑盒子而是被创建为具有非常强大的属性,并且太多UTF-8的程序员都看不到这个他们自己也经常使用它。

iconv可以用于我的身材。

 #include  iconv_t cd; char out[7]; wchar_t in = CODE_POINT_VALUE; size_t inlen = sizeof(in), outlen = sizeof(out); cd = iconv_open("utf-8", "wchar_t"); iconv(cd, (char **)&in, &inl, &out, &outlen); iconv_close(cd); 

但是我担心wchar_t可能不代表Unicode代码点,而是任意值。编辑:我想你可以通过简单地使用Unicode源来实现:

 uint16_t in = UNICODE_POINT_VALUE; cd = iconv_open("utf-8", "ucs-2"); 

libiconv 。

哪个平台? 在Windows上,您可以使用WideCharToMultiByte (CP_UTF8,…)

可以说,源代码点必须以UTF-16编码,这意味着您必须能够进行此类编码。 在某些情况下(代理对),这不是微不足道的。

我的理解是你在给定的代码页中有一些文本,并且你想将它转换为Unicode(UTF-16)。 对? MultiByteToWideChar(codePage,sourceText,…)/ WideCharToMultiByte(CP_UTF8,utf16Text,…)往返将完成这一操作。