我必须检查一些文本并根据字符模式编写 UTF-8 输出。我认为如果我可以使用代码点并将其转换为 UTF-8,那将很容易。我一直在阅读有关 Unicode 和 UTF-8 的资料,但找不到好的解决方案。任何帮助将不胜感激。
最佳答案
将 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 的程序员无法看到这一点,直到他们自己已经使用了很多。
关于c - 是否有将 Unicode 代码点转换为 UTF-8 的 C 库?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4607413/