zoukankan      html  css  js  c++  java
  • 区别wchar_t,char,WCHAR

    1.区别wchar_t,char,WCHAR

     

       ANSI:即 char,可用字符串处理函数:strcat( ),strcpy( ), strlen( )等以str打头的函数。

       UNICODE:wchar_t是Unicode字符的数据类型,它实际定义在里:

       typedef unsigned short wchar_t;

       另外,在头文件中有这样的定义:typedef wchar_t WCHAR; 所以WCHAR实际就是wchar_t

       wchar_t 可用字符串处理函数:wcscat(),wcscpy(),wcslen()等以wcs打头的函数。为了让编译器识别Unicode字符串,必须以在前面加一个“L”,例如: wchar_t *szTest=L"This is a Unicode string.";

     

    char c = 'a'; // c保存了字符a,占一个字节

    wchar_t wc = L'a'; // wc保存了宽字符a,占两个字节。注意'a'表示字符a,L'a'表示宽字符a

    2.TCHAR

    在C语言里面提供了 _UNICODE宏(有下划线),在Windows里面提供了UNICODE宏(无下划线),只要定了_UNICODE宏和UNICODE宏,系统就会自动切换到UNICODE版本,否则,系统按照ANSI的方式进行编译和运行。只定义了宏并不能实现自动的转换,他还需要一系列的字符定义支持。

    1. TCHAR

    如果定义了UNICODE宏则TCHAR被定义为wchar_t。

    typedef wchar_t TCHAR;

       否则TCHAR被定义为char typedef char TCHAR;

    2. LPTSTR

       如果定义了UNICODE宏则LPTSTR被定义为LPWSTR。

       typedef LPTSTR LPWSTR;

       否则TCHAR被定义为char typedef LPTSTR LPSTR;

       说明:在使用字符串常量的时候需要使用_TEXT(“MyStr”)或者_T("")来支持系统的自动转换。

     

    3.BSTR

       BSTR是一个带长度前缀的字符串,主要由操作系统来管理的,所以要用api.主要用来和VB打交道的(VB里的string就是指它)要操作它的API函数有很多.比如SysAllocString,SysFreeString等等.

       vc里封装它的类如_bstr_t,及ATL中的CComBSTR等.

       一个 BSTR 由头部和字符串组成,头部包含了字符串的长度信息,字符串中可以包含嵌入的 null 值。

       BSTR 是以指针的形式进行传递的。(指针是一个变量,包含另外一个变量的内存地址,而不是数据。) BSTR 是 Unicode 的,即每个字符需要两个字节。 BSTR 通常以两字节的 null 字符结束。 wstr是宽字符,以双字节表示一个字符 bstr是为了与原先的basic字符兼容,它的最前面的4个字节为其长度,以''结束.

     

    4.更进一步的字符串以及其指针的类型定义 

    由于Win32 API文档的函数列表使用函数的常用名字(例如, "SetWindowText"),所有的字符串都是用TCHAR来定义的。(除了XP中引入的只适用于Unicode的API)。下面列出一些常用的typedefs,你可以在msdn中看到他们。

    type        Meaning in MBCS builds        Meaning in Unicode builds

    WCHAR        wchar_t              wchar_t

    LPSTR        char*                char*

    LPCSTR        const char*            const char*

    LPWSTR       wchar_t*               wchar_t*

    LPCWSTR     wchar_t*               wchar_t*

    TCHAR         TCHAR char            wchar_t

    LPTSTR        TCHAR*             TCHAR*

    LPCTSTR      const TCHAR*          const TCHAR*

     

    5.相互转换

    (1) char*转换成CString

      若将char*转换成CString,除了直接赋值外,还可使用CString::Format进行。例如:

    char chArray[] = "This is a test";

    char * p = "This is a test";

      或

    LPSTR p = "This is a test";

      或在已定义Unicode应的用程序中

    TCHAR * p = _T("This is a test");

      或

    LPTSTR p = _T("This is a test");

    CString theString = chArray;

    theString.Format(_T("%s"), chArray);

    theString = p;

     

    (2) CString转换成char*

      若将CString类转换成char*(LPSTR)类型,常常使用下列三种方法:

      方法一,使用强制转换。例如:

    CString theString( "This is a test" );

    LPTSTR lpsz =(LPTSTR)(LPCTSTR)theString;

      方法二,使用strcpy。例如:

    CString theString( "This is a test" );

    LPTSTR lpsz = new TCHAR[theString.GetLength()+1];

    _tcscpy(lpsz, theString);

      需要说明的是,strcpy(或可移值Unicode/MBCS的_tcscpy)的第二个参数是 const wchar_t* (Unicode)或const char* (ANSI),系统编译器将会自动对其进行转换。

      方法三,使用CString::GetBuffer。例如:

    CString s(_T("This is a test "));

    LPTSTR p = s.GetBuffer();

    // 在这里添加使用p的代码

    if(p != NULL) *p = _T('');

    s.ReleaseBuffer();

    // 使用完后及时释放,以便能使用其它的CString成员函数

     

    (3) BSTR转换成char*

      方法一,使用ConvertBSTRToString。例如:

    #include

    #pragma comment(lib, "comsupp.lib")

    int _tmain(int argc, _TCHAR* argv[]){

    BSTR bstrText = ::SysAllocString(L"Test");

    char* lpszText2 = _com_util::ConvertBSTRToString(bstrText);

    SysFreeString(bstrText); // 用完释放

    delete[] lpszText2;

    return 0;

    }

      方法二,使用_bstr_t的赋值运算符重载。例如:

    _bstr_t b = bstrText;

    char* lpszText2 = b;

     

    (4) char*转换成BSTR

      方法一,使用SysAllocString等API函数。例如:

    BSTR bstrText = ::SysAllocString(L"Test");

    BSTR bstrText = ::SysAllocStringLen(L"Test",4);

    BSTR bstrText = ::SysAllocStringByteLen("Test",4);

      方法二,使用COleVariant或_variant_t。例如:

    //COleVariant strVar("This is a test");

    _variant_t strVar("This is a test");

    BSTR bstrText = strVar.bstrVal;

      方法三,使用_bstr_t,这是一种最简单的方法。例如:

    BSTR bstrText = _bstr_t("This is a test");

      方法四,使用CComBSTR。例如:

    BSTR bstrText = CComBSTR("This is a test");

      或

    CComBSTR bstr("This is a test");

    BSTR bstrText = bstr.m_str;

      方法五,使用ConvertStringToBSTR。例如:

    char* lpszText = "Test";

    BSTR bstrText = _com_util::ConvertStringToBSTR(lpszText);

    (5) CString转换成BSTR

      通常是通过使用CStringT::AllocSysString来实现。例如:

    CString str("This is a test");

    BSTR bstrText = str.AllocSysString();

    SysFreeString(bstrText); // 用完释放

     

    (6) BSTR转换成CString

      一般可按下列方法进行:

    BSTR bstrText = ::SysAllocString(L"Test");

    CStringA str;

    str.Empty();

    str = bstrText;

      或

    CStringA str(bstrText);

     

    (7) ANSI、Unicode和宽字符之间的转换

      方法一,使用MultiByteToWideChar将ANSI字符转换成Unicode字符,使用WideCharToMultiByte将Unicode字符转换成ANSI字符。

      方法二,使用“_T”将ANSI转换成“一般”类型字符串,使用“L”将ANSI转换成Unicode,而在托管C++环境中还可使用S将ANSI字符串转换成String*对象。例如:

    TCHAR tstr[] = _T("this is a test");

    wchar_t wszStr[] = L"This is a test";

    String* str = S”This is a test”;

      方法三,使用ATL 7.0的转换宏和类。ATL7.0在原有3.0基础上完善和增加了许多字符串转换宏以及提供相应的类,它具有如图3所示的统一形式:

      其中,第一个C表示“类”,以便于ATL 3.0宏相区别,第二个C表示常量,2表示“to”,EX表示要开辟一定大小的缓冲。SourceType和DestinationType可以是A、 T、W和OLE,其含义分别是ANSI、Unicode、“一般”类型和OLE字符串。例如,CA2CT就是将ANSI转换成一般类型的字符串常量。下面是一些示例代码:

    LPTSTR tstr= CA2TEX<16>("this is a test");

    LPCTSTR tcstr= CA2CT("this is a test");

    wchar_t wszStr[] = L"This is a test";

    char* chstr = CW2A(wszStr);

  • 相关阅读:
    react ts axios 配置跨域
    npm run eject“Remove untracked files, stash or commit any changes, and try again.”错误
    java 进程的参数和list的线程安全
    帆软报表 大屏列表跑马灯效果JS
    帆软报表 快速复用数据集,避免重复劳动
    分析云 OA中部门分级思路和实现方法
    分析云 分段器 只显示一个块的数据
    分析云 更改服务默认的端口号
    分析云U8项目配置方法新版本(2)
    Oracle 创建时间维度表并更新是否工作日字段
  • 原文地址:https://www.cnblogs.com/MATU/p/3818174.html
Copyright © 2011-2022 走看看