解决方法
将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; else goto error;
此外,您自己做的是指您可以将api调整为您需要的工作类型(一次一个字符或长字符串).如果知道输入是有效的Unicode标量值,则可以删除错误情况.
另一个方向是很难得到正确的.我建议使用有限自动机方法,而不是典型的位运算循环,有时将无效序列解码为真实字符的别名(这是非常危险的,可能导致安全问题).
编辑:即使你最终还是去图书馆,我想你应该首先尝试写作,或者至少在进一步研究UTF-8规范之前先认真学习.当UTF-8不是一个黑匣子,而是被创建为拥有非常强大的属性时,很多坏的设计可能来自将UTF-8视为一个黑盒子,而对于UTF-8来说,很多新的程序员无法看到这一点,直到他们自己一起工作了很多.