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++编程之字符串解惑--Unicode & MBCS的更多相关文章

  1. VC++编程中常用的字符串转换函数

    VC++编程中经常遇到不同编码编码的字符串之间需要转换的情况,以下简单提供几个不同编码字符串之间的转换函数: ANSI 字符串和Unicode字符串之间的转换 //Convert wide char ...

  2. windows 编程—— 宽字符集 与 Unicode

    目录: 从ASCII码 到 Unicode Windows 编程中的 "字符” 定义 (如何在windows下进行通用编码) 常用的通用函数,定义 (本文为学习<Programming ...

  3. 将ASCII字符串转换为UNICODE字符串

    写在前面的话:在MFC的网络编程中,由于现在项目都是使用UNICODE编码,但是网络API的许多函数却只能接受const char*的参数,所以经常会遇到需要将char*转换为TCHAR*的时候,有一 ...

  4. Python3 编程之字符串处理

    Python3 编程之字符串处理 在编程中最常见的任务就是字符串的处理,So,学好字符串的使用非常重要 一.变量的定义规范 Python中声明变量时,要符合以下规则为准: 只能使用数字.字母.下划线组 ...

  5. 【转】VC中的字符串处理

    http://hi.baidu.com/nmn714/item/ab8d2a96d0f2d6f228164727 貌似不少人刚开始做windows程序时都会纠结在字符串处理上,所以我把关于字符串处理的 ...

  6. js中 字符串与Unicode 字符值序列的相互转换

    一. 字符串转Unicode 字符值序列 var str = "abcdef"; var codeArr = []; for(var i=0;i<str.length;i++ ...

  7. Python语言总结 4.2. 和字符串(str,unicode等)处理有关的函数

    4.2.7. 去除控制字符:removeCtlChr Python语言总结4.2. 和字符串(str,unicode等)处理有关的函数Sidebar     Prev | Up | Next4.2.7 ...

  8. 字符串与Unicode码的相互转换

    //1,字符串转换为unicode码 var s = '吴'; //2,unicode码转字符串 '\u5434'.toString(16) //吴 或者 String.fromCharCode(21 ...

  9. java对含有中文的字符串进行Unicode编码

    public class MyUtil { public static void main(String[] args) throws Exception { String s = "a中a ...

随机推荐

  1. .net MVC 使用 JSON JavaScriptSerializer 进行序列化或反序列化时出错,字符串的长度超过了为 maxJsonLength 属性设置的值

    在.net mvc的controller中,方法返回JsonResult,一般我们这么写: [HttpPost] public JsonResult QueryFeature(string url, ...

  2. GridView用法的修改和删除

    (前台) <asp:GridView ID="GridView1" runat="server" AutoGenerateColumns="Fa ...

  3. ubuntu 下关闭MySql server

    转自 http://blog.csdn.net/tobacco5648/article/details/7625048 在终端输入命令 开启:     sudo   /etc/init.d/mysql ...

  4. opencv是什么

    OpenCV是一个用于图像处理.分析.机器视觉方面的开源函数库.       不管你是做科学研究,还是商业应用,opencv都能够作为你理想的工具库,由于,对于这两者,它全然是免费的.该库採用C及C+ ...

  5. redis缓存工具Jedis进行跨jvm加锁(分布式应用)--不幸暂弃用--能够做第三方锁使用

    近期使用redis碰到了多个并发处理同一个缓存的情况.在这样的情况下须要进行加锁机制. 本来想使用java自带的ReadWriteLock进行设置读写锁,这也是上家公司使用的方法. 后来经过商讨,给予 ...

  6. 解析带有命名空间问题web.xml

    <?xml version="1.0" encoding="UTF-8"?> <web-app version="2.5" ...

  7. load、save方法、spark sql的几种数据源

    load.save方法的用法          DataFrame usersDF = sqlContext.read().load("hdfs://spark1:9000/users.pa ...

  8. BZOJ 1269: [AHOI2006]文本编辑器editor( splay )

    splay..( BZOJ 1507 题目基本相同..双倍经验 ) ------------------------------------------------------------------ ...

  9. Krita 3.0 发布,KOffice 的图像处理器(刺激一下自己的神经)

    Krita 3.0 发布了,经历了一年多的开发,动画功能被集成到Krita核心,改善了绘画功能,可及时预览绘画结果,该版本也是最新移植到QT的版本. 查看完整发布说明,可以点击这里. 下载地址: Wi ...

  10. Observer设计模式【利用商品概念解释】

    每个人都想过着富有的生活,这是很正常的. 这里以开店进货为例. 在讲之前解释英语单词: Observer:查看:遵守 Observable:可见的,公开的. 从单词可以知道:商品用来卖,所以公开,继承 ...