读书人

unicode下debug和release下对字符的处

发布时间: 2012-03-27 13:44:24 作者: rapoo

unicode下debug和release下对字符的处理的区别?
在debug版本下处理就没错
release版本下就有错误... - -#

C/C++ code
BOOL CXml::Create(CString strFilePath,CString sRootName){    if(!IsFileExist(strFilePath))    {                HANDLE h_xmlFile;                h_xmlFile = CreateFile(strFilePath, GENERIC_WRITE, 0, NULL, CREATE_NEW, 0, 0);        if (h_xmlFile == INVALID_HANDLE_VALUE) {            XTrace(_T("Create File %s Error"), strFilePath);            return FALSE;        }        SetFilePointer(h_xmlFile,0,0,FILE_BEGIN);        char *xBuf=(char*)malloc(40*sizeof(char));        memcpy(xBuf,"<?xml version=\"1.0\" encoding=\"utf-8\"?>",sizeof("<?xml version=\"1.0\" encoding=\"utf-8\"?>\n"));        DWORD numWritten;        if (!WriteFile(h_xmlFile,xBuf,strlen(xBuf),&numWritten,0)||numWritten!=strlen(xBuf)) {            DeleteFile(strFilePath);            CloseHandle(h_xmlFile);            XTrace(_T("Write xml header Error"));            return FALSE;        }                CString sRoot;        sRoot.Format(_T("<%s>"),sRootName);                if (!WriteFile(h_xmlFile,sRoot,sRoot.GetLength(),&numWritten,0)||numWritten!=sRoot.GetLength()) {            DeleteFile(strFilePath);            CloseHandle(h_xmlFile);            XTrace(_T("Write xml root start Error"));            return FALSE;        }                sRoot.Format(_T("</%s>"),sRootName);        if (!WriteFile(h_xmlFile,sRoot,sRoot.GetLength(),&numWritten,0)||numWritten!=sRoot.GetLength()) {            DeleteFile(strFilePath);            CloseHandle(h_xmlFile);            XTrace(_T("Write xml root end Error"));            return FALSE;        }                CloseHandle(h_xmlFile);    }    else        XTrace(_T("File %s Already Exist"), strFilePath);    return TRUE;}


[解决办法]
在UNICODE下你不该使用char*和"<?xml ...",这个显然是ANSI串。你应该使用TCHAR*

TCHAR* xBuf = (TCHAR*)new TCHAR[40];
_tcscpy_s<40>(xBuf, _T("<?xml version=\"1.0\" encoding=\"utf-8\"?>"));

读书人网 >VC/MFC

热点推荐