• <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 閱讀(1318) 評論(0)  編輯 收藏 引用 所屬分類: VC/MFC
            精品人妻伦九区久久AAA片69| 777久久精品一区二区三区无码| 久久久久99这里有精品10| 麻豆精品久久久久久久99蜜桃| 亚洲狠狠婷婷综合久久久久 | 无码8090精品久久一区| 久久亚洲AV无码精品色午夜 | 国产精品久久久香蕉| 99999久久久久久亚洲| 一本久久综合亚洲鲁鲁五月天| 久久棈精品久久久久久噜噜| 91久久香蕉国产熟女线看| 久久乐国产综合亚洲精品| 国产精品久久久久影院色| 久久久久99这里有精品10| 99久久精品免费看国产免费| 久久精品国产99国产精品亚洲 | 亚洲精品国产自在久久| 91精品国产色综合久久| 久久亚洲精品国产精品婷婷| 99久久国产热无码精品免费| 色综合久久久久综合99| 久久免费视频网站| 久久99精品久久久久子伦| 中文字幕无码久久人妻| 久久国产精品偷99| 91亚洲国产成人久久精品| 99国产精品久久| 色综合久久久久综合体桃花网 | 日韩欧美亚洲综合久久影院Ds | 国产精品久久99| 婷婷久久香蕉五月综合加勒比| 中文成人无码精品久久久不卡| 国产精品天天影视久久综合网| 久久久久女人精品毛片| 亚洲国产精品无码久久SM | 久久AV高潮AV无码AV| 久久这里都是精品| 一本色道久久综合亚洲精品| 伊人久久五月天| 97精品依人久久久大香线蕉97|