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;

转载于:https://www.cnblogs.com/riasky/p/3435944.html

VC++编程之字符串解惑--Unicode MBCS相关推荐

  1. VC下几种转换为UNICODE字符串的方法

    在vc6.0的环境下,通常字符是采用ANSI方式进行编码的,而现在很多程序或者应用之间的交互,是需要采用UNICODE字符编码的.比方说使用GDI+或者使用sqlite3的链接.那么VC下有哪些方法, ...

  2. C#网络编程(异步传输字符串) - Part.3[转自JimmyZhang博客]

    源码下载:http://www.tracefact.net/SourceCode/Network-Part3.rar C#网络编程(异步传输字符串) - Part.3 这篇文章我们将前进一大步,使用异 ...

  3. 规范化编程:ANSI和UNICODE的使用

    规范化编程:ANSI和UNICODE的使用    到底什么是ANSI,什么是UNICODE呢?其实这是两种不同的编码方式标准,ANSI中的字符采用8bit,而UNICODE中的字符采用16bit.8b ...

  4. vc++ 编程 经典电子书

    完整版目录都在这里了:http://www.cctry.com/forum-46-1.html C.C++ 语言: 一个月挑战C++ http://www.cctry.com/thread-778-1 ...

  5. 《实用VC编程之玩转控件》第1课:Windows编程简介

    本文转载自: VC驿站 https://www.cctry.com/thread-297374-1-1.html 0.开发环境: 操作系统:Microsoft Windows 7 Ultimate S ...

  6. C#网络编程(同步传输字符串)

    C#网络编程(同步传输字符串) - Part.2 服务端客户端通信 在与服务端的连接建立以后,我们就可以通过此连接来发送和接收数据.端口与端口之间以流(Stream)的形式传输数据,因为几乎任何对象都 ...

  7. JavaScript中字符串与Unicode编码的互相转换

    JavaScript中字符串与Unicode编码的互相转换 这段代码演示了JavaScript中字符串与Unicode编码的转换: // 为了控制台的演示方便, 变量没有添加 var 定义 // 实际 ...

  8. VC编程规范(转自http://www.zhongguoidc.com/htm_data/69/0608/28000.html)

    VC编程规范-程序员应该这样写代码 王者归来VC编程规范-程序员应该这样写代码 基本要求 1.1 程序结构清析,简单易懂,单个函数的程序行数不得超过100行. 1.2 打算干什么,要简单,直接了当,代 ...

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

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

  10. go语言编程之字符串操作

    2019独角兽企业重金招聘Python工程师标准>>> http://www.beckbi.cn/?p=288 go语言编程之字符串操作 转载于:https://my.oschina ...

最新文章

  1. 吴恩达《神经网络与深度学习》精炼笔记(4)-- 浅层神经网络
  2. oracle update 数据库恢复,ORACLE update 操作内部原理
  3. 匹配行linux中grep命令的使用
  4. 一些来自STL的好东西
  5. Gradle自定义插件
  6. arm-linux-gcc/ld/objcopy/objdump使用总结[zz]
  7. 图片格式转换大小调整工具_如何轻松快速地将图片转换到JPG/JPEG/PNG/BMP/TIFF
  8. wordpress支持MySQL5.5_CentOS 5.5安装Nginx、PHP(FastCGI)、MySQL --搭建LNMP环境安装Wordpress...
  9. ffmpeg 转换VC工具 V1.1.1
  10. linux date命令 下月,Linux date命令用法和使用技巧(获取今天.昨天.一分钟前等)
  11. 2021考研数学二汤家凤接力题典1800【题目册】
  12. fat32文件系统详细介绍_文件系统介绍
  13. 国家统计局:政府统计应用大数据的主要障碍
  14. 什么是主数据?什么是主数据管理系统?
  15. javafor循环基础练习 -26个大小写字母
  16. qss 更改图标_Qt实现自定义图标功能
  17. 约瑟夫环!编 号是1,2,??,n的n个人按照顺时针方向围坐一圈,每个人只有一个密码(正整数)。一开始任选一个正整数作为报数上限值m,从第一个仍开始顺时针方向 自1开始顺序报数,报到m时停止报数。
  18. 小孩发烧请慎用抗病毒类药物!
  19. 深入理解面向对象,面向对象3个特性7个原则6种关系
  20. 电机磁链和反电动势系数辨识

热门文章

  1. python aiml_Python AIML搭建聊天机器人实例
  2. 计算机专业范文推荐信,出国留学推荐信范文,计算机专业
  3. 找出数组中第二大的值
  4. java.util.concurrent.atomic.AtomicBoolean 源码
  5. 梅山启动建设智慧管网 为城市管理者提供智能决策支持
  6. UVa 674 - Coin Change
  7. HanLP: Han Language Processing
  8. 汽车维保反欺诈系统的设计和算法应用
  9. 第四季-专题10-字符设备驱动模型
  10. samba 安装配置部署和优化