2010-08-07 41 views
5

我試圖用MultiByteToWideChar() WinAPI函數轉換字節流。如何將字節流轉換爲另一種編碼?

文檔說函數失敗,ERROR_NO_UNICODE_TRANSLATION對不完整的字符串(多字節編碼字符串中沒有尾隨字節)。我如何防止此錯誤?想到的唯一方法不是轉換輸入緩衝區的最後一個多字節字符(使用IsDBCSLeadByteEx()來定位它)。

是否有更好的解決方案來轉換字節流?

+0

你使用哪個代碼頁?您以哪種形式收到數據?我希望從開始到結束,而不是相反。 – Oleg 2010-10-19 16:38:20

+0

該代碼應該能夠與Windows平臺支持的所有代碼頁一起使用。我以多字節或單字節編碼方式接收數據,並希望以廣泛的形式在內部處理它,將其轉換爲輸出(處理後)的區域特定編碼。 – Basilevs 2010-10-19 17:32:41

回答

2

在我看來,你可以只使用CharNextExA移動到輸入流中的下一個字符位置。通過這種方式,您可以獲得一些字符並在UNICODE字符串中將其轉換爲MultiByteToWideChar。在獲得UNICODE文本片段後,您可以使用WideCharToMultiByte將其轉換爲另一個代碼頁。

修訂:我肯定接收所述輸入數據流的過程中是要慢得多的數據相對於的CharNextExAMultiByteToWideCharWideCharToMultiByte解碼。例如,如果在堆棧上使用緩衝區,如WCHAR szBuffer[4096]TCHAR szDestBuffer[4096],那麼您將能夠非常快速地解碼1K的輸入數據。所以我想,你的整個程序的總工作時間將幾乎縮短從這三個功能的使用。

此外,我不確定您有任何其他選擇。我不知道從文本末尾開始解碼文本的可靠方法。也許其他人有另一個想法...

+0

我需要更高效的方法 - 數據塊非常大,我不想爲每個符號調用函數。有沒有辦法減少一些電話? – Basilevs 2010-10-19 17:34:52

+1

在我看來,如果你想支持Windows平臺支持的所有代碼頁,另一種方式是不可能的。在「IsDBCSLeadByteEx」的文檔中,您可以閱讀:「前導字節值是針對每個不同的DBCS特定的,某些字節值可以作爲DBCS字符的前導字節和尾字節出現在單個代碼頁中,因此,IsDBCSLeadByteEx只能指示一個潛在的前導字節值「。因此,使用CharNextExA對數據進行順序掃描似乎是唯一安全的方法。只需驗證您是否將填寫「CharNextExA」使用情況的任何性能變化。它很快。 'CharPrevExA'很慢 – Oleg 2010-10-19 18:03:18

+1

正在用CharPrevExA()分析在10000字節緩衝區末尾的10個字節的尾部,而不是用CharNextExA()處理整個緩衝區? CharPrevExA能否正常工作,將字符的中間值設置爲lpCurrentChar參數? – Basilevs 2010-10-20 05:21:46

相關問題