CString::GetLength()獲得字節數的正確方法

      前段時間,做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字符。該方法也正確。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章