C++ 转换编码

C++ 转换编码,c++,winapi,encoding,utf-8,C++,Winapi,Encoding,Utf 8,我正在使用Win32 APIMultiByteToWideChar()函数将任何编码转换为宽字符。问题是,我将以流式方式传输数据。例如,我可以将一块固定宽度的数据读入缓冲区,然后调用该函数 问题是当该块位于多字节字符之间时,MultiByteToWideChar()将失败 我的问题是,如何获取缓冲区中最后一个完整字符的索引? 我想每次函数失败时,我都可以使用缩短的缓冲区再试一次,但如果使用大缓冲区,则效率极低 我想这样做是因为我试过ICONV和ICU。ICONV比.NET解码器类慢,所以我用C+

我正在使用Win32 API
MultiByteToWideChar()
函数将任何编码转换为宽字符。问题是,我将以流式方式传输数据。例如,我可以将一块固定宽度的数据读入缓冲区,然后调用该函数

问题是当该块位于多字节字符之间时,
MultiByteToWideChar()
将失败

我的问题是,如何获取缓冲区中最后一个完整字符的索引?

我想每次函数失败时,我都可以使用缩短的缓冲区再试一次,但如果使用大缓冲区,则效率极低


我想这样做是因为我试过ICONV和ICU。ICONV比.NET解码器类慢,所以我用C++实现了。然后,我发现ICU比.NET解码器快。然后,我发现
MultiByteToWideChar()
是最快的。

对于UTF8,通过设计,您可以识别编码代码点中的第一个字节。因此,很容易从缓冲区的f开始,然后结束,并找到正确的位置进行切碎。其他的多字节编码不太合适。我想这样做是因为我试过Iconv和ICU。Iconv比.NET解码器类慢,所以我用C++实现了。然后,我发现ICU比.NET解码器快。然后,我发现MultibyteToWideChar是最快的。你确定解码是你程序的瓶颈吗?是的,我确定。实际上,我对ICU的性能非常满意,只是对于最精简的版本,它需要大约6.5MB的应用程序大小:(你说的“完整字符”是什么意思?最后一个代码点?还是真正的完整字符(可能包括多个代码点)?走到末尾,检查下一个代码点,然后检查它是否正在合并,跳到下一个代码点…算法用Unicode描述