如何将字节流转换为另一种编码?
我试图用MultiByteToWideChar() WinAPI函数转换字节流。如何将字节流转换为另一种编码?
文档说函数失败,ERROR_NO_UNICODE_TRANSLATION对不完整的字符串(多字节编码字符串中没有尾随字节)。我如何防止此错误?想到的唯一方法不是转换输入缓冲区的最后一个多字节字符(使用IsDBCSLeadByteEx()来定位它)。
是否有更好的解决方案来转换字节流?
在我看来,你可以只使用CharNextExA移动到输入流中的下一个字符位置。通过这种方式,您可以获得一些字符并在UNICODE字符串中将其转换为MultiByteToWideChar。在获得UNICODE文本片段后,您可以使用WideCharToMultiByte将其转换为另一个代码页。
修订:我肯定接收所述输入数据流的过程中是要慢得多的数据相对于的CharNextExA,MultiByteToWideChar和WideCharToMultiByte解码。例如,如果在堆栈上使用缓冲区,如WCHAR szBuffer[4096]
和TCHAR szDestBuffer[4096]
,那么您将能够非常快速地解码1K的输入数据。所以我想,你的整个程序的总工作时间将几乎缩短从这三个功能的使用。
此外,我不确定您有任何其他选择。我不知道从文本末尾开始解码文本的可靠方法。也许其他人有另一个想法...
我需要更高效的方法 - 数据块非常大,我不想为每个符号调用函数。有没有办法减少一些电话? – Basilevs 2010-10-19 17:34:52
在我看来,如果你想支持Windows平台支持的所有代码页,另一种方式是不可能的。在“IsDBCSLeadByteEx”的文档中,您可以阅读:“前导字节值是针对每个不同的DBCS特定的,某些字节值可以作为DBCS字符的前导字节和尾字节出现在单个代码页中,因此,IsDBCSLeadByteEx只能指示一个潜在的前导字节值“。因此,使用CharNextExA对数据进行顺序扫描似乎是唯一安全的方法。只需验证您是否将填写“CharNextExA”使用情况的任何性能变化。它很快。 'CharPrevExA'很慢 – Oleg 2010-10-19 18:03:18
正在用CharPrevExA()分析在10000字节缓冲区末尾的10个字节的尾部,而不是用CharNextExA()处理整个缓冲区? CharPrevExA能否正常工作,将字符的中间值设置为lpCurrentChar参数? – Basilevs 2010-10-20 05:21:46
你使用哪个代码页?您以哪种形式收到数据?我希望从开始到结束,而不是相反。 – Oleg 2010-10-19 16:38:20
该代码应该能够与Windows平台支持的所有代码页一起使用。我以多字节或单字节编码方式接收数据,并希望以广泛的形式在内部处理它,将其转换为输出(处理后)的区域特定编码。 – Basilevs 2010-10-19 17:32:41