檢查自已的**時,發現乙個比較弱智的錯誤,是關於轉碼的,和cstring的=操作符有關。
為了能簡單重現,我模擬了一下**:
//未有unicode或_unicode定義
uses_conversion;
cstring stest(_t("test中文"));
stest = a2w(stest);
::messageboxw(null,(lpcwstr)stest.getbuffer(0),l"test中文標題",mb_ok);
輸出:對話方塊的內容區為亂碼。
我的想象中:a2w取得寬字串,然後賦值給cstring,cstring中應該儲存的是寬字串。
顯然,並不如我想,想是沒用的,仔細看一下出錯的原因吧。
先看看cstring=操作符原始碼:
#ifdef _unicode
……#else //!_unicode
const cstring& cstring::operator=(lpcwstr lpsz)
哇,_wcstombsz在幹什麼?
再看看它的**:
int afx_cdecl _wcstombsz(char* mbstr, const wchar_t* wcstr, size_t count)
嘿,居然是在轉碼噢。
好了,答案找到了,cstring的 = 操作符居然會智慧型的做轉碼,所以上面**的stest最終得到的仍然是ansi字串。因此,輸出是亂碼。
結論:cstring = 操作符是有轉碼功能的,會將右側的字元轉為tchar的當前編碼方式。
換句話說,如果你想實現a2t或是w2t,那你根本不需要用atl的巨集,直接用cstring的=就可以了,呵呵。
好了,改一下前文的**,不能想當然,老老實實的做吧。
uses_conversion;
cstring stest(_t("test中文"));
lpwstr lpwsztest = a2w(stest);
::messageboxw(null,lpwsztest.getbuffer(0),l"test中文標題",mb_ok);
c string類的操作符過載
首先 先了解 class 類裡面給我們 預設過載了6個函式 分別是 預設構造 預設析夠 預設賦值 拷貝構造 過載 過載 然而我們需要關注的是 拷貝構造 因為如果你不重寫 拷貝構造的話 裡面的 資料全部都是淺拷貝 當 自己的倆個string 相等的時候 就會出問題 它裡面的char只想同乙個空間 所以...
關於UNPIVOT 操作符
簡而言之,unpivot操作符就是取得乙個行的資料集合,然後把每一行都轉換成多個行資料。為了更好地理解,請看下圖 圖1從上圖中,你能發現unpovot操作符,取得了兩行資料,每行包含三個price值,然後將這些轉化成6行資料,其中每個產品 都是乙個不同的行。unpivot 命令制定了兩個不同的列型別...
關於UNPIVOT 操作符
簡而言之,unpivot操作符就是取得乙個行的資料集合,然後把每一行都轉換成多個行資料。為了更好地理解,請看下圖 圖1從上圖中,你能發現unpovot操作符,取得了兩行資料,每行包含三個price值,然後將這些轉化成6行資料,其中每個產品 都是乙個不同的行。unpivot 命令制定了兩個不同的列型別...