zoukankan      html  css  js  c++  java
  • VC++编程之字符串解惑--Unicode & MBCS

               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   

          一个指向以’’结尾的字符串指针,字符用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

              一个指向以’’结尾的字符串的指针,字符用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;


  • 相关阅读:
    spring boot 扫描不到自定义Controller
    SpringBoot+Maven多模块项目(创建、依赖、打包可执行jar包部署测试)完整流程
    spring boot 中使用 jpa以及jpa介绍
    java8 快速实现List转map 、分组、过滤等操作
    Mysql 创建函数出现This function has none of DETERMINISTIC, NO SQL, or READS SQL DATA
    Spring mvc @initBinder 类型转化器的使用
    @RequestMapping 和@ResponseBody 和 @RequestBody和@PathVariable 注解 注解用法
    ssm的自动类型转换器
    如果将get请求转换成post请求
    如何将post请求转换成put和delete请求
  • 原文地址:https://www.cnblogs.com/riasky/p/3435944.html
Copyright © 2011-2022 走看看