2013-04-09 63 views
2

此韓文文本(quoted-printable)「2013-03-22 = 0E?@ HD = 0F 05:30」未正確地被MultiByteToWideChar轉換爲Unicode。這裏引用的可打印格式僅用於放置此文本,實際內容包含0xE和0xF字節。MultiByteToWideChar無法識別某些韓語字符

MultiByteToWideChar(50225, 0, bs.pData, bs.nSize, pData + nSize, nConvertedLen); 

= 0E?@ HD = 0F按原樣轉換,生成的Unicode包含0xE和0xF ASCII字符。但是,我發現一些韓文字符應該出現在那裏,而不是這些字符。我一直認爲國際字符序列以大於127的代碼開始,但最近發現它不是真的。但是,MultiByteToWideChar仍然認爲我的方式並拒絕對待0xE? @ H D 0xF作爲50225(或949)代碼頁的幾個非ASCII韓文字符。當我在使用.NET函數的同一臺計算機上執行相同操作時(例如Encoding.GetEncoding(50255).GetString),我可以正確地獲得轉換結果,並且韓文字符在那裏。但MultiByteToWideChar不起作用。我嘗試了可以​​爲MultiByteToWideChar(MB_COMPOSITE等)設置的不同標誌,但仍然沒有運氣。

如何讓MultiByteToWideChar正常工作?如果重要,我使用WinXP SP3。再次,.NET方式工作正常,並且內部Encoding.GetString似乎調用MultiByteToWideChar。

回答

3

這是一個known issue。根本原因是50225中SHIFT IN(0x0E)和SHIFT OUT(0x0F)的不一致使用。它們不用作編碼轉換

理解這些字節本身不是字符很重要。代碼頁50225不是普通的多字節編碼,例如, UTF-8。 UTF-8是無狀態的;相同的字節序列總是解碼爲相同的Unicode。 50255中的字節序列的解碼取決於先前消耗的字節,特別是0x0E和0x0F。

給出的建議很有意義。使用任何理智的Unicode編碼。 (我個人建議UTF-8)。

0

而不是使用的MultiByteToWideChar我建議使用IMultiLanguage::ConvertStringToUnicode代替,這是suggested by Microsoft並正確解碼的字符。唯一的「缺點」是它需要MultiByteToWideChar在Windows 2000上工作的Windows XP。不是一個巨大的缺點IMO。

IMultiLanguage也有一些其他的工具,使編碼的轉換更容易,例如IMultiLanguage :: GetCharsetInfoIMultiLanguage :: EnumCodePages