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