• VC字符处理(一)AnsicUnicode处理


     

    1.ANSIC与Unicode字符

       两者区别就不多少了,一个单字节一个双字节,Unicode可以表示更多的字符,适合诸如汉字的文字系统.

       定义使用宽字符:

     2.声明Unicode字符与及字符串方法:

       _T()宏需要包含tchar.h

    1 wchar_t c=L'A';
    2 wchar_t szBuffer[10]=L"A String";
    3  

    WinNt.h定义了一下宏:

    1 #ifdef UNICODE
    2 typedef WCHAR TCHAR ,*PTCHAR,PTSTR;
    3 typedef CONST WCHAR *PCTSTR;
    4 #define __TEXT(quote) quote
    5 #define __TEXT(quote) L##quote
    6
    7 #else
    8 typedef CHAR TCHAR ,*PTCHAR,PTSTR;
    9 typedef CONST CHAR *PCTSTR;
    10 #define __TEXT(quote) quote
    11
    12 #endif
    13 #define __TEXT(quote) quote TEXT(quote)
    14
    15  

     

     可以利用以上宏来定义:在Visual Studio新建工程,一般都开启了Unicode选项,直接就可以定义宽字符。

    1 TCHAR C=TXET('a');//如果定义了Unicode 则是16位字符,否则是8位
    2   TCHAR C=L'a';
    3 TCHAR szBuffer[10]=TEXT("a String");
    4 TCHAR szBuffer[10]=_T("a String");
    5  

    3.Ansic与Unicode的转换:

     

    1 //定义ANSIC字符串
    2   char *c ="Test!";
    3 std::cout<<c<<std::endl;
    4 //ANSIC转到宽字符
    5   int Length = MultiByteToWideChar(CP_ACP,0,c,-1,NULL,0);
    6 wchar_t *pWideCharStr = new wchar_t[sizeof(wchar_t)*Length];
    7 MultiByteToWideChar(CP_ACP,0,c,6,pWideCharStr,Length*sizeof(wchar_t));
    8 std::wcout<<"MultiByteToWideChar:"<<pWideCharStr<<std::endl;
    9 //宽字符转换到ANSIC
    10   Length = WideCharToMultiByte(CP_ACP,0,pWideCharStr,-1,NULL,0,NULL,NULL);
    11 char *pMultiByte = new char[Length*sizeof(char)] ;
    12 WideCharToMultiByte(CP_ACP,0,pWideCharStr,-1,pMultiByte,Length*sizeof(char),NULL,NULL);
    13 std::cout<<"WideCharToMultiByte:"<<pMultiByte;
    14
    15 delete [] pWideCharStr;
    16 delete [] pMultiByte;

     补充:

           size_t wcstombs ( char * mbstr, const wchar_t * wcstr, size_t max );//Convert wide-character string to multibyte string

           size_t mbstowcs ( wchar_t * wcstr, const char * mbstr, size_t max );//Convert multibyte string to wide-character string

          这两个看就清楚怎么用了就不写了 比上面方法要简单

    4.推荐的字符串使用方式

    1).开始将文本字符串想像为字符的数组,而不是char或字节的数组
    2).用通用的数据类型如用TCHAR PTSTR表示字符和字符串
    3).统一用TEXT _T宏来表示字面量的字符和字符串,不要混用
    4).用BYTE和 PBYTE来表示字节、字节指针和数据缓冲区
    5).避免使用printf系列函数,尤其不要使用%s来进行Ansic跟Unicode的互相转换
          应该使用MultiByteToWideChar和WideCharToMutiByte,具体用法参看MSDN

    6).推荐从现在开始就使用Unicode字符,理由很简单,为了程序代码的重用性:Com编程模型只支持Unicode   

          微软.Net技术,还有新的API函数都不支持ANSIC

     

     /*转载请注明出处:听风独奏www.GbcDbj.com-----Charm*/

    点击这里给我发消息
  • 相关阅读:
    Spring 发生 has not been refreshed yet 异常
    rsyslog config
    grok
    阿里云态势
    Unity的asm笔记
    Unity2020或Unity2019安装后无法启动
    rider代码折叠
    使用rider调试lua
    MacType更好的字体渲染
    Unity字体和画面花屏处理
  • 原文地址:https://www.cnblogs.com/charm/p/1792266.html
Copyright © 2020-2023  润新知