[宽]字符串转换

      可以利用L运算符和若干函数在[单字节/多字节的]普通字符串和[双字节的]宽字符串之间进行相互转换。

      1. char -> wchar_t

          1) L运算符

          在串常量前加上L运算符,可以将普通字符串转换为宽字符串;例如:

          wchar_t *wstr = L"A string to a wide character string.";

          CString str = L"A string to a wide character string.";

          MessageBox(L"创建位图出错!", L"错误");

          2) AllocSysString函数

          可以利用CString类的AllocSysString()函数来将普通字符串转换成宽字符串:

          BSTR AllocSysString() const;

          其中BSTR相当于wchar_t *的typedef类型。例如:

          CString str("A string to a wide character string.");

          wchar_t *wstr = str.AllocSysString();

          MessageBox(wstr);

          说明:CString类是VC中定义的MFC/ATL共享模板类CStringT的一个实现:

          template< typename BaseType, class StringTraits > class CStringT :

          public CSimpleStringT <BaseType, _CSTRING_IMPL_ :: _MFCDLLTraitsCheck < BaseType, StringTraits > ::c_bIsMFCDLLTraits> // <cstringt.h>或<atlstr.h>

          typedef ATL::CStringT< TCHAR, StrTraitMFC_DLL< TCHAR > > CString; // <afxstr.h>

          3) mbstowcs[_s]函数

          可以用<stdlib.h>中定义的多字节字符串到宽字符串的C语言转换函数:

          size_t mbstowcs( wchar_t *wcstr, const char *mbstr, size_t count ); // 成功返回被转换的字符数,失败返回-1

                                                                                                       // 若wcstr = NULL,则返回所需宽字符串的大小(宽字符数)

          errno_t mbstowcs_s( size_t *pConvertedChars, wchar_t *wcstr, size_t sizeInWords, const char *mbstr, size_t count ); // 成功返回0

          来将普通[多字节]字符串转换为宽字符串。例如:

          char *str = "A sample string.";

          wchar_t wstr[80];

          size_t cn = 0; // 输出参数,用于存放被转换的字符数,包括null结束符'\0'

          if (!mbstowcs_s(&cn, wstr, 80, str, strlen(str))) MessageBox(wstr);

          else MessageBox(L"转换字符串出错!");

       2. wchar_t -> char(只能用于西文串,不能用于中文串)

           只能利用<stdlib.h>中定义的宽字符串到多字节字符串的C语言转换函数:(返回值同前)

           size_t wcstombs( char *mbstr, const wchar_t *wcstr, size_t count );

           errno_t wcstombs_s( size_t *pConvertedChars, char *mbstr, size_t sizeInBytes, const wchar_t *wcstr, size_t count );

           来将宽字符串转换为普通[多字节]字符串。例如:

           char str[80];

           wchar_t *wstr = L"A sample string.";

           size_t cn = 0; // 输出参数,用于存放被转换的字符数,包括null结束符'\0'

           if (wcstombs_s(&cn, str, 80, wstr, wcslen(wstr))) MessageBox(L"转换字符串出错!");

           又例如:

           int m, n;

           const size_t bufSize = 300;

           char buf[bufSize];

           wchar_t wbuf[bufSize];

           CString fn = pDoc->GetPathName();

           wcscpy_s(wbuf, bufSize, fn);

           size_t cn = 0;

           wcstombs_s(&cn, buf, bufSize, wbuf, bufSize);

           FILE *stream;

           if (!fopen_s(&stream, buf, "rt")) {

                fscanf_s(stream, "%d %d", &m, &n);

               //……

           }

posted @ 2010-08-10 10:23  涂墨留香  阅读(2097)  评论(0编辑  收藏  举报