zoukankan      html  css  js  c++  java
  • CHAR,TCHAR,WCHAR 三者的区别与转换

    #ifdef   UNICODE     
              typedef   wchar_t   TCHAR;    

    #else     
              typedef   unsigned   char   TCHAR;    

    #endif     
    typedef   unsigned   char   CHAR;     
    typedef   unsigned   wchar_t   WCHAR;   

    由此可以看出,CHAR实施上就是unsigned char,WCHAR为宽字符,而TCHAR根据是否支持unicode而不同。

    在程序使用sizeof(TCAHR),当默认设置时,这个值是1;当定义UNICODE宏时,这个值是2。

    转换函数:
    //—————————————————————————–
    // Name: DXUtil_ConvertAnsiStringToWide()
    // Desc: This is a UNICODE conversion utility to convert a CHAR string into a
    //       WCHAR string. cchDestChar defaults -1 which means it 
    //       assumes strDest is large enough to store strSource
    //—————————————————————————–
    VOID DXUtil_ConvertAnsiStringToWide( WCHAR* wstrDestination, const CHAR* strSource, 
                                         int cchDestChar )
    {
        if( wstrDestination==NULL || strSource==NULL )
            return;

        if( cchDestChar == -1 )
            cchDestChar = strlen(strSource)+1;

        MultiByteToWideChar( CP_ACP, 0, strSource, -1, 
                             wstrDestination, cchDestChar-1 );

        wstrDestination[cchDestChar-1] = 0;
    }

    //—————————————————————————–
    // Name: DXUtil_ConvertWideStringToAnsi()
    // Desc: This is a UNICODE conversion utility to convert a WCHAR string into a
    //       CHAR string. cchDestChar defaults -1 which means it 
    //       assumes strDest is large enough to store strSource
    //—————————————————————————–
    VOID DXUtil_ConvertWideStringToAnsi( CHAR* strDestination, const WCHAR* wstrSource, 
                                         int cchDestChar )
    {
        if( strDestination==NULL || wstrSource==NULL )
            return;

        if( cchDestChar == -1 )
            cchDestChar = wcslen(wstrSource)+1;

        WideCharToMultiByte( CP_ACP, 0, wstrSource, -1, strDestination, 
                             cchDestChar-1, NULL, NULL );

        strDestination[cchDestChar-1] = 0;
    }

    //—————————————————————————–
    // Name: DXUtil_ConvertGenericStringToAnsi()
    // Desc: This is a UNICODE conversion utility to convert a TCHAR string into a
    //       CHAR string. cchDestChar defaults -1 which means it 
    //       assumes strDest is large enough to store strSource
    //—————————————————————————–
    VOID DXUtil_ConvertGenericStringToAnsi( CHAR* strDestination, const TCHAR* tstrSource, 
                                            int cchDestChar )
    {
        if( strDestination==NULL || tstrSource==NULL )
            return;

    #ifdef _UNICODE
        DXUtil_ConvertWideStringToAnsi( strDestination, tstrSource, cchDestChar );
    #else
        if( cchDestChar == -1 )
        strcpy( strDestination, tstrSource );
        else
        strncpy( strDestination, tstrSource, cchDestChar );
    #endif
    }

    //—————————————————————————–
    // Name: DXUtil_ConvertGenericStringToWide()
    // Desc: This is a UNICODE conversion utility to convert a TCHAR string into a
    //       WCHAR string. cchDestChar defaults -1 which means it 
    //       assumes strDest is large enough to store strSource
    //—————————————————————————–
    VOID DXUtil_ConvertGenericStringToWide( WCHAR* wstrDestination, const TCHAR* tstrSource, 
                                            int cchDestChar )
    {
        if( wstrDestination==NULL || tstrSource==NULL )
            return;

    #ifdef _UNICODE
        if( cchDestChar == -1 )
         wcscpy( wstrDestination, tstrSource );
        else
         wcsncpy( wstrDestination, tstrSource, cchDestChar );
    #else
        DXUtil_ConvertAnsiStringToWide( wstrDestination, tstrSource, cchDestChar );
    #endif
    }

    //—————————————————————————–
    // Name: DXUtil_ConvertAnsiStringToGeneric()
    // Desc: This is a UNICODE conversion utility to convert a CHAR string into a
    //       TCHAR string. cchDestChar defaults -1 which means it 
    //       assumes strDest is large enough to store strSource
    //—————————————————————————–
    VOID DXUtil_ConvertAnsiStringToGeneric( TCHAR* tstrDestination, const CHAR* strSource, 
                                            int cchDestChar )
    {
        if( tstrDestination==NULL || strSource==NULL )
            return;
            
    #ifdef _UNICODE
        DXUtil_ConvertAnsiStringToWide( tstrDestination, strSource, cchDestChar );
    #else
        if( cchDestChar == -1 )
        strcpy( tstrDestination, strSource );
        else
        strncpy( tstrDestination, strSource, cchDestChar );
    #endif
    }

    //—————————————————————————–
    // Name: DXUtil_ConvertAnsiStringToGeneric()
    // Desc: This is a UNICODE conversion utility to convert a WCHAR string into a
    //       TCHAR string. cchDestChar defaults -1 which means it 
    //       assumes strDest is large enough to store strSource
    //—————————————————————————–
    VOID DXUtil_ConvertWideStringToGeneric( TCHAR* tstrDestination, const WCHAR* wstrSource, 
                                            int cchDestChar )
    {
        if( tstrDestination==NULL || wstrSource==NULL )
            return;

    #ifdef _UNICODE
        if( cchDestChar == -1 )
         wcscpy( tstrDestination, wstrSource );
        else
         wcsncpy( tstrDestination, wstrSource, cchDestChar );
    #else
        DXUtil_ConvertWideStringToAnsi( tstrDestination, wstrSource, cchDestChar );
    #endif
    }

    http://www.hankcs.com/program/cpp/distinction_with_the_conversion_of_char_tchar_wchar_three.html

  • 相关阅读:
    2020阿里最新出品的泰山版Java开发手册,告别垃圾代码
    freecplus框架-目录操作
    freecplus框架简介
    freecplus框架-加载参数文件
    freecplus框架-xml解析
    freecplus框架-tcp网络通信
    freecplus框架-PostgreSQL数据库操作
    freecplus框架-Oracle数据库操作
    freecplus框架-MySQL数据库操作
    freecplus框架-ftp客户端
  • 原文地址:https://www.cnblogs.com/Vcanccc/p/5722474.html
Copyright © 2011-2022 走看看