• 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

  • 相关阅读:
    Java中JNI的使用详解第四篇:C/C++中创建Java对象和String字符串对象及对字符串的操作方法 分类: Java 2013-12-27 12:39 2024人阅读 评论(0) 收藏
    Android中运行的错误:java.lang.UnsatisfiedLinkError: Couldn't load locSDK3: findLibrary returned null. 分类: Android 2013-12-26 15:29 21858人阅读 评论(10) 收藏
    使用VC6.0编译C++代码的时候报错:fatal error C1071: unexpected end of file found in comment(Mark ZZ) 2013-12-24 13:12 737人阅读 评论(0) 收藏
    Android中onTouch方法的执行过程以及和onClick执行发生冲突的解决办法 2013-12-23 16:35 14333人阅读 评论(6) 收藏
    Java中JNI的使用详解第三篇:JNIEnv类型中方法的使用 2013-12-21 15:40 2565人阅读 评论(0) 收藏
    UIView常用的一些方法小记之setNeedsDisplay和setNeedsLayout
    IOS UIImage类方法总结
    iOS 如何选择delegate、notification、KVO
    ios 中 KVO
    IOS 设置Launch image停留时间
  • 原文地址:https://www.cnblogs.com/Vcanccc/p/5722474.html
Copyright © 2020-2023  润新知