• <ins id="pjuwb"></ins>
    <blockquote id="pjuwb"><pre id="pjuwb"></pre></blockquote>
    <noscript id="pjuwb"></noscript>
          <sup id="pjuwb"><pre id="pjuwb"></pre></sup>
            <dd id="pjuwb"></dd>
            <abbr id="pjuwb"></abbr>

            love in C++, live on MFC

            to get ready...

            C++博客 首頁 新隨筆 聯系 聚合 管理
              47 Posts :: 0 Stories :: 97 Comments :: 0 Trackbacks
            情況是這樣的,一個程序從ansi移植到了unicode,見把代碼移植成UNICODEhttp://m.shnenglu.com/flyingxu/archive/2006/05/18/7356.html),之后產生了一個問題,之前文件保存的那些文件,unicode版本還能打開嗎?這真是個大問題,如果不能,就基本表示這個程序已經半死不活了。

            文件的保存基本用的序列化,比如
            void?CSDITestDoc::Serialize(CArchive&?ar)
            {
            ????
            if
            ?(ar.IsStoring())
            ????{
            ????????
            //?TODO:?add?storing?code?here

            ????????ar?<<?m_strName;
            ????}
            ????
            else

            ????{
            ????????
            //?TODO:?add?loading?code?here
            ????????ar?>>?m_strName;
            ????}
            }
            如果m_strName = _T("name");那么ansi情況下,保存的文件為:
            04 6E 61 6D 65,一共5個字節。
            然后用unicode版本保存時,是
            FF FE FF 04 6E 00 61 00 6D 00 65 00,一共12個字節。

            然后我發現,ansi版本的可以打開unicode版本的文件,unicode版本的也可以打開ansi版本的文件。

            為什么?我覺得關鍵在于CString,我覺得CString功能比較強大。
            CString的序列化函數
            //?CString?serialization?code
            //?String?format:
            //??????UNICODE?strings?are?always?prefixed?by?0xff,?0xfffe
            //??????if?<?0xff?chars:?len:BYTE,?TCHAR?chars
            //??????if?>=?0xff?characters:?0xff,?len:WORD,?TCHAR?chars
            //??????if?>=?0xfffe?characters:?0xff,?0xffff,?len:DWORD,?TCHARs

            CArchive
            &?AFXAPI?operator<<(CArchive&?ar,?const?CString&?string)
            {
            ????
            //?special?signature?to?recognize?unicode?strings
            #ifdef?_UNICODE
            ????ar?
            <<?(BYTE)0xff;
            ????ar?
            <<?(WORD)0xfffe;
            #endif

            ????
            if?(string.GetData()->nDataLength?<?255)
            ????{
            ????????ar?
            <<?(BYTE)string.GetData()->nDataLength;
            ????}
            ????
            else?if?(string.GetData()->nDataLength?<?0xfffe)
            ????{
            ????????ar?
            <<?(BYTE)0xff;
            ????????ar?
            <<?(WORD)string.GetData()->nDataLength;
            ????}
            ????
            else
            ????{
            ????????ar?
            <<?(BYTE)0xff;
            ????????ar?
            <<?(WORD)0xffff;
            ????????ar?
            <<?(DWORD)string.GetData()->nDataLength;
            ????}
            ????ar.Write(
            string.m_pchData,?string.GetData()->nDataLength*sizeof(TCHAR));
            ????
            return?ar;
            }
            它對unicode做了特別的支持
            特別是當它在讀序列化過程的時候
            CArchive&?AFXAPI?operator>>(CArchive&?ar,?CString&?string)
            {
            #ifdef?_UNICODE
            ????
            int?nConvert?=?1;???//?if?we?get?ANSI,?convert

            #else
            ????
            int?nConvert?=?0;???//?if?we?get?UNICODE,?convert
            #endif

            ????UINT?nNewLen?
            =?_AfxReadStringLength(ar);
            ????
            if?(nNewLen?==?(UINT)-1
            )
            ????{
            ????????nConvert?
            =?1?-
            ?nConvert;
            ????????nNewLen?
            =
            ?_AfxReadStringLength(ar);
            ????????ASSERT(nNewLen?
            !=?-1
            );
            ????}

            ????
            //?set?length?of?string?to?new?length

            ????UINT?nByteLen?=?nNewLen;
            #ifdef?_UNICODE
            ????
            string.GetBufferSetLength((int
            )nNewLen);
            ????nByteLen?
            +=?nByteLen?*?(1?-?nConvert);??//?bytes?to?read

            #else
            ????nByteLen?
            +=?nByteLen?*?nConvert;????//?bytes?to?read
            ????if?(nNewLen?==?0)
            ????????
            string.GetBufferSetLength(0
            );
            ????
            else

            ????????
            string.GetBufferSetLength((int)nByteLen+nConvert);
            #endif


            ????
            //?read?in?the?characters
            ????if?(nNewLen?!=?0)
            ????{
            ????????ASSERT(nByteLen?
            !=?0
            );

            ????????
            //?read?new?data

            ????????if?(ar.Read(string.m_pchData,?nByteLen)?!=?nByteLen)
            ????????????AfxThrowArchiveException(CArchiveException::endOfFile);

            ????????
            //?convert?the?data?if?as?necessary

            ????????if?(nConvert?!=?0)
            ????????{
            #ifdef?_UNICODE
            ????????????CStringData
            *?pOldData?=?string
            .GetData();
            ????????????LPSTR?lpsz?
            =?(LPSTR)string
            .m_pchData;
            #else

            ????????????CStringData
            *?pOldData?=?string.GetData();
            ????????????LPWSTR?lpsz?
            =?(LPWSTR)string
            .m_pchData;
            #endif

            ????????????lpsz[nNewLen]?
            =?'\0';????//?must?be?NUL?terminated
            ????????????string.Init();???//?don't?delete?the?old?data
            ????????????string?=?lpsz;???//?convert?with?operator=(LPWCSTR)
            ????????????CString::FreeData(pOldData);
            ????????}
            ????}
            ????
            return
            ?ar;
            }
            也就是說,不管你保存的文件是不是unicode,都可以讀進來,轉換稱當前unicode或者ansi版本

            不過回到文章的標題,這里只講了用CString序列化的保存。如果是其他保存方式,可以學著CString的做法,寫函數把文件總是能讀進來。
            posted on 2006-06-13 23:53 flyingxu 閱讀(1326) 評論(0)  編輯 收藏 引用 所屬分類: VC/MFC
            91精品国产91久久久久久| 人妻精品久久久久中文字幕| 精品久久人人爽天天玩人人妻| 国产精品激情综合久久| 国产亚洲精久久久久久无码AV| 久久综合视频网站| 伊人久久大香线蕉av一区| 久久久久人妻一区精品性色av| 99久久国产亚洲高清观看2024| 色婷婷噜噜久久国产精品12p | 日本久久中文字幕| 国内精品久久久久影院老司| 97久久婷婷五月综合色d啪蜜芽| 成人综合伊人五月婷久久| 久久激情五月丁香伊人| 久久精品国产2020| 精品国产综合区久久久久久 | 久久国产AVJUST麻豆| 久久久久久夜精品精品免费啦| 99久久精品免费| 久久久久久人妻无码| 无码乱码观看精品久久| 国产91久久精品一区二区| 久久乐国产综合亚洲精品| 久久本道伊人久久| 欧美黑人又粗又大久久久| 国产A级毛片久久久精品毛片| 丁香色欲久久久久久综合网| 久久久久亚洲精品无码网址| 国产亚洲欧美成人久久片| 久久九九精品99国产精品| 久久中文字幕人妻熟av女| 久久精品成人| 久久国产影院| 亚洲а∨天堂久久精品| 国内精品久久久久久久亚洲| 亚洲午夜久久久精品影院| 国产精品久久永久免费| 99久久超碰中文字幕伊人| 999久久久无码国产精品| 久久精品国产亚洲AV无码麻豆|