前段時間,做http協議上傳文件及斷點續傳控件時,在客戶端采用C++調用CHttpConnection、CHttpFile進行文件上傳。移植到Unicode編碼時,上傳得到的文件總是小於正常文件。最終發現問題出在CString::GetLength()方法上。當采用Unicode編碼時,而且http header字符串中出現了中文或其其他多字節字符,該方法仍舊只返回字符數,而不是實際的字節數,這樣在http header中的信息會比實際的少,導致http發送的數據小於預期的。
按照MSDN的說嗎,在選用MBCS多字節字符串編碼時,該方法會得到正確的字節數。此時沒有問題。
For multibyte character sets (MBCS), GetLength counts each 8-bit character; that is, a lead and trail byte in one multibyte character are counted as two bytes.
但是在Unicode編碼下,一旦出現中文字符,該方法就會少統計。
我試用最多的解決方法是:
CString str("abc我");
DWORD le0 = str.GetLength(); // 返回4,不是想要的字節數
// 這樣處理就對了。先用CStringA類轉化成多字節字符串。
le0 = CStringA(str).GetLength();
另外,也有人這樣用,也可以。比上面效率高。
DWORD le0 = str.GetLength() * sizeof(TCHAR);
// 這種用法在MBCS環境下可以省略。在Unicode下,所有字符(包括ascii及中文字符), 每個字符都被定義為WHAR, 即雙字節Unicode字符。該方法也正確。