• <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://www.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 閱讀(1331) 評論(0)  編輯 收藏 引用 所屬分類: VC/MFC
            久久人人爽人人爽人人片av麻烦| 狠狠色婷婷久久一区二区| A狠狠久久蜜臀婷色中文网| 91精品日韩人妻无码久久不卡| 66精品综合久久久久久久| 国产香蕉久久精品综合网| 91视频国产91久久久| 麻豆av久久av盛宴av| 国产激情久久久久影院| 久久丫忘忧草产品| 国产精品成人久久久久久久| 久久精品国产亚洲AV久| 99久久精品免费看国产| 国产成人无码久久久精品一| 亚洲а∨天堂久久精品9966| 51久久夜色精品国产| 91精品国产91久久综合| 欧美国产成人久久精品| 激情久久久久久久久久| 久久青青草原国产精品免费| 少妇人妻综合久久中文字幕| 欧美与黑人午夜性猛交久久久| 久久99国产精品二区不卡| 久久精品国产亚洲AV香蕉| 久久笫一福利免费导航| 内射无码专区久久亚洲| 精品久久久久久无码人妻热| 久久精品国产精品国产精品污 | 久久水蜜桃亚洲av无码精品麻豆| 久久亚洲国产成人影院网站 | 久久久噜噜噜久久熟女AA片| 三级韩国一区久久二区综合| 久久久久久青草大香综合精品| 久久综合九色综合97_久久久| 国产精品女同久久久久电影院 | 综合久久国产九一剧情麻豆| 亚洲综合久久久| 亚洲中文久久精品无码| 久久99精品久久久久久hb无码| 久久亚洲国产成人精品性色| 久久九九全国免费|