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

时间:2011-01-05 17:52:55

标签: c unicode utf-8

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

4 个答案:

答案 0 :(得分:35)

将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的程序员都看不到这个他们自己也经常使用它。

答案 1 :(得分:5)

我可以使用iconv。

#include <iconv.h>

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");

答案 2 :(得分:2)

答案 3 :(得分:1)

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

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

我的理解是,您在给定的代码页中有一些文本,并且您希望将其转换为Unicode(UTF-16)。对? MultiByteToWideChar(codePage,sourceText,...)/ WideCharToMultiByte(CP_UTF8,utf16Text,...)往返就可以了。