我必须经历一些文本并根据字符模式编写UTF8输出.我认为如果我可以使用代码点并将其转换为UTF8将会很容易.我一直在阅读有关unicode和UTF8的内容,但无法找到一个好的解决方案.任何帮助将不胜感激.
R..*_*R.. 36
将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;
Run Code Online (Sandbox Code Playgroud)
另外,自己动手意味着你可以将api调整到你需要的工作类型(一次一个字符?还是长字符串?)如果你知道输入是有效的Unicode标量值,你可以删除错误情况.
另一个方向更难以纠正.我建议使用有限自动机方法,而不是典型的位算术循环,有时会将无效序列解码为真实字符的别名(这非常危险并且可能导致安全问题).
编辑:即使你最终选择了图书馆,我认为你应该先尝试自己编写,或者至少认真学习UTF-8规范,然后才能进一步学习.很多糟糕的设计都可以将UTF-8当作一个黑盒子来处理,因为它不是一个黑盒子而是被创建为具有非常强大的属性,并且太多UTF-8的程序员都没有看到这个他们自己也经常使用它.
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);
Run Code Online (Sandbox Code Playgroud)
但是我担心wchar_t可能不代表Unicode代码点,而是代表任意值.编辑:我想你可以通过简单地使用Unicode源来实现:
uint16_t in = UNICODE_POINT_VALUE;
cd = iconv_open("utf-8", "ucs-2");
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
12994 次 |
| 最近记录: |