c - 是否有将 Unicode 代码点转换为 UTF-8 的 C 库?

标签 c unicode utf-8

我必须检查一些文本并根据字符模式编写 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/

相关文章:

c - scanf 和 double 的问题

python - "lxml.etree.XPathEvalError: Invalid expression"带有 Unicode 元素名称

javascript,我们如何读取带有重音字母的本地文本文件?

c - 如何打印两个指针之间的一行内容(来自外部文件)

c - 如何在C程序中检查字符串末尾是否有/字符

Cygwin html 到浏览器

mysql - 特殊字符和简单的选择查询

ruby - 在 Ruby 中将 Unicode 数字转换为整数

java - Windows 中的西里尔文 Console(java) System.out.println();

windows - 将 Subversion 提交消息转换为 Unicode