// 各种字符串类型之间的转换

#include <atlbase.h>
#include <iostream>

using namespace std;

int main()
{
 // UNICODE 到 MBCS(多字节字符集)
 {
  LPOLESTR lpw = L"Hello,你好";
  size_t wLen = wcslen(lpw) + 1;
  int aLen = ::WideCharToMultiByte(
   CP_ACP,
   0,
   lpw,  // 宽字符串指针
   wLen,  // 字符长度
   NULL,
   0,   // 参数0表示计算转换后的字符空间
   NULL,
   NULL);
  LPSTR lpa = new char[aLen];
  ::WideCharToMultiByte(
   CP_ACP,
   0,
   lpw,
   wLen,
   lpa,  // 转换后的字符串指针
   aLen,  // 给出空间大小
   NULL,
   NULL);
  delete [] lpa;
 }

 // MBCS 到 UNICODE
 {
  LPCSTR lpa = "Hello,你好!";
  size_t aLen = strlen(lpa) + 1;
  int wLen = ::MultiByteToWideChar(
   CP_ACP,
   0,
   lpa,
   aLen,
   NULL,
   0);
  LPOLESTR lpw = new wchar_t[wLen];
  ::MultiByteToWideChar(
   CP_ACP,
   0,
   lpa,
   aLen,
   lpw,
   wLen);
  cout << lpa << endl;
  cout << lpw << endl;
  delete [] lpw;
 }

 // 使用ATL提供的宏
 // A2BSTR   OLE2A    T2A     W2A
 // A2OLE   OLE2BSTR   T2BSTR    W2BSTR
 // A2CT    OLE2CA    T2CA    W2CA
 // A2CW    OLE2CT    T2COLE    W2COLE
 // A2OLE   OLE2CW    T2CW    W2CT
 // A2T    OLE2T    T2OLE    W2OLE
 // A2W    OLE2W    T2W     W2T
 //
 // 说明:
 // 2:    转换为
 // A:    ANSI字符串,也就是MBCS
 // W, OLE:   宽字符串,也就是UNICODE
 // T:    中间类型T。如果定义了_UNICODE,则T表示W,如果定义了_MBCS,则T表示A
 // C:    const的缩写
 //
 // 调用范例:
 {
  USES_CONVERSION;   // 只需调用一次,就可以在函数中进行多次转换
  LPCSTR lp = OLE2A(L"Hello,你好!");
  // 不用显示释放 lp 的内存,因为 ATL 转换宏使用栈作为临时空间,函数结束后会自动释放空间
  cout << lp << endl;
 }
 // 使用 ATL 转换宏,由于不用释放临时空间,所以使用起来非常方便。但是考虑到栈空间的尺寸(VC 默认2M),使用时要注意几点:
 // 1、只适合于进行短字符串的转换;
 // 2、不要试图在一个次数比较多的循环体内进行转换;
 // 3、不要试图对字符型文件内容进行转换,因为文件尺寸一般情况下是比较大的;
 // 4、对情况 2 和 3,要使用 MultiByteToWideChar() 和 WideCharToMultiByte();

 return 0;
}

posted on 2010-09-17 14:24  云中君  阅读(5666)  评论(0编辑  收藏  举报