VC编程:VC++之字符串解惑--Unicode & MBCS
小标 2018-08-14 来源 : 阅读 1310 评论 0

摘要:本文主要向大家介绍了VC编程:VC++之字符串解惑--Unicode & MBCS,通过具体的内容向大家展示,希望对大家学习VC编程有所帮助。

本文主要向大家介绍了VC编程:VC++之字符串解惑--Unicode & MBCS,通过具体的内容向大家展示,希望对大家学习VC编程有所帮助。

      VC++中的字符串用起来着实让人难受,LPTSTR、LPCTSTR、LPCSTR、LPCWSTR、LPSTR、WCHAR、CString、_T()和L彼此之间的互相转换更是头痛。根据使用经验和MSDN Libary文档总结出如下:
 
1.CString类型字符串
 
            CString位于头文件afx.h中,是MFC中的一种字符串类型的类。此处解释CString与LPSTR、LPCSTR相互转换问题。
 
             注:typedef char CHAR;  typedef CHAR* LPSTR;  typedef CONST CHAR * LPCSTR;
                        1.1  LPSTR转换成CString
 
                                 LPSTR lpStr =  “TestString”;
 
                                 CString str(lpStr);
 
                      
                         1.2  CString 转换成 LPSTR
                                 方法一:
 
                                 CString strName("TestString");
 
                                 LPSTR lpStr = strName.GetBuffer();
 
                                 strName.ReleaseBuffer();
 
 
                                 方法二:
 
                                 CString strName("TestString");
 
                                  LPSTR lpStr = (LPSTR)(LPCSTR) strName;
 
    
 2.  LPSTR、LPCSTR、LPWSTR、LPCWSTR、LPTSTR、LPCTSTR详解
 
         首先要补充两个宏的解释:UNICODE和MBCS
         MBCS宏对应的字符串指针是char *也就是LPSTR:typedef char * LPSTR
 
         UNICODE宏对应的指针是unsigned·short * 也就是LPWSTR: typedef unsigned·short* LPWSTR
MBCS:
        它是多字节字符集,它是不定长表示世界文字的编码。MBCS表示英文字母时就和ASCII一样(这也是我们容易把MBCS和ASCII搞混的原因), 但表示其他文字时就需要用多字节。
 
UNICODE:
 
         它是用两个字节表示一个字符的方法。比如字符'A'在ASCII下面是一个字符,可'A'在UNICODE下面是两个字符,高字符用0填充,而且汉字'程'在ASCII下面是两个字节,而在UNICODE下仍旧是两个字节。UNICODE的用处就是定长表示世界文字,据统计,用两个字节可以编码现存的所有文字而没有二义。
                   
 
       WINDOWS下面的程序设计可以支持MBCS和UNICODE两种编码的字符串,具体用那种就看你定义了MBCS宏还是 UNICODE宏。LPTSTR、LPCSTR、LPCTSTR、LPSTR的意义:
 
        LPSTR:32bit指针 指向一个字符串,每个字符占1字节;
 
        LPCSTR:32-bit指针 指向一个常字符串,每个字符占1字节;
        LPCTSTR:32-bit指针 指向一个常字符串,每字符可能占1字节或2字节,取决于Unicode是否定义;
        LPTSTR:32-bit指针 每字符可能占1字节或2字节,取决于Unicode是否定义。
 
    
LPSTR   
 
      一个指向以’\0’结尾的字符串指针,字符用8位Windows(ANSI)字符表示。更多信息参考“字体使用的字符集”。这种类型在WinNT.h中声明如下:
 
           typedef  CHAR* LPSTR;
          
 
LPCSTR  (WinNT.h)
           typedef _nullterminated CONST CHAR * LPCSTR;
 
        补充: wchar_t 是本机类型
        如果编译时指定编译参数 /Zc:wchar_t-,编译器就会要求定义wchar_t,或者要求包括定义它的众多头文件中的一个文件(如:wchar.h).wchar_t 通常定义为typedef unsigned short  wchar_t;
        编译器通过使用 /Zc:wchar_t 将wchar_t识别为本机类型。有关wchar_t的更多信息,参看MSDN Libary 的Data type Ranges条目。
 
 
WCHAR (Esent.h)
 
            The WCHAR data type contains a 16-bit Unicode character.
 
              #if !define(_NATIVE_WCHAR_T_DEFINE)
 
                    typedef  unsigned short WCHAR;
 
              #else 
 
                   typedef wchar_t WCHAR;   //此处的wchar_t类型大小随机器不同(指机器字长)而不同
 
              #endif
 
         
LPWSTR
          一个指向以’\0’结尾的字符串的指针,字符用16位Unicode字符集表示。更多信息参考“字体使用的字符集”。这种类型在WinNT.h中声明如下:
 
              typedef  WCHAR * LPWSTR;
 
LPCWSTR
 
            typedef CONST WCHAR * LPCWSTR;
 
      
LPCTSTR   (WinNT.h)
 
          #ifdef  UNICODE
 
                  typedef  LPCWSTR  LPCTSTR;
 
          #else
 
                 typedef  LPCSTR  LPCTSTR;
 
          #endif
         
3. _T() 和 L
 
        _T()一般同字符串相关,如_T("Hello, seeking!");如果你编译一个程序为MBCS方式,_T()实际不起任何作用。而如果编译一个程序为UNICODE方式,则编译器会把"Hello" 字符串以UNICODE方式保存。
        _T() 和 L 的区别在于,使用L时不管你是以什么方式编译,一律UNICODE方式保存。如:L“Hello!”。其实“L”是来源于C++中对宽字符(Weld Char,比如Unicode字符)的定义,如:wstring wstrName = L"Hello, seeking!";
 
 
4.C语言数组和LPCSTR之间的转换
         4.1 数组转成LPCSTR(即const char*)
 
              char pchar_pcchar[20]= "pchar_pcchar";
 
              if( typeid(pchar_pcchar)== typeid(char[20]) )
 
                     cout<< "char [20]" <<endl;
 
               const char* PCChar=pchar_pcchar;   //数组直接可以转成LPCSTR
 
               cout<< PCChar << endl;
 
      输出结果:char [20]
 
                           pchar_pcchar
 
 
 
       4.2 LPCSTR(即const char*)转成数组(即char*)
 
               Mark20130912:思路还未找到
 
               Mark20131119:一种思路
 
                       LPCSTR lpcstr = “long point const string”;
 
                       char * arry = (char *) lpcstr;
 
                       cout << arry << endl;
     

本文由职坐标整理并发布,希望对同学们有所帮助。了解更多详情请关注职坐标编程语言VC/MFC频道!

本文由 @小标 发布于职坐标。未经许可,禁止转载。
喜欢 | 1 不喜欢 | 0
看完这篇文章有何感觉?已经有1人表态,100%的人喜欢 快给朋友分享吧~
评论(0)
后参与评论

您输入的评论内容中包含违禁敏感词

我知道了

助您圆梦职场 匹配合适岗位
验证码手机号,获得海同独家IT培训资料
选择就业方向:
人工智能物联网
大数据开发/分析
人工智能Python
Java全栈开发
WEB前端+H5

请输入正确的手机号码

请输入正确的验证码

获取验证码

您今天的短信下发次数太多了,明天再试试吧!

提交

我们会在第一时间安排职业规划师联系您!

您也可以联系我们的职业规划师咨询:

小职老师的微信号:z_zhizuobiao
小职老师的微信号:z_zhizuobiao

版权所有 职坐标-一站式AI+学习就业服务平台 沪ICP备13042190号-4
上海海同信息科技有限公司 Copyright ©2015 www.zhizuobiao.com,All Rights Reserved.
 沪公网安备 31011502005948号    

©2015 www.zhizuobiao.com All Rights Reserved