LPSTR: 指向一个字符串的32位指针,每个字符占1个字节。
LPCSTR:指向一个常量字符串的32位指针,每个字符占1个字节。
LPTSTR:指向一个字符串的32位指针,每个字符可能占1个字节或2个字节。此字串可移植到Unicode和DBCS
LPCTSTR:指向一个常量字符串的32位指针,每个字符可能占1个字节或2个字节。此字串可移植到Unicode   和DBCS

ANSI(即MBCS):多字节字符集,不定长表示世界文字的编码方式。ANSI表示英文字母时就和ASCII一样,但表示其他文字时就需要用多字节。
Unicode:用两个字节表示一个字符的编码方式。比如字符’A’在ASCII下面用一个字节表示,而在Unicode下面用两个字节表示,其中高字节用“0”填充;函数’程’在ASCII下面用两个字节表示,而在Unicode下面也是用两个字节表示。Unicode的用处就是定长表示世界文字,据统计,用两个字节可以编码现存的所有文字而没有二义。

Windows下的程序设计可以支持ANSI和Unicode两种编码方法的字符串,使用哪种要看定义了MBCS宏还是Unicode宏。MBCS宏对应的字符串指针为LPSTR(即char*),Unicode对应的指针为LPWSTR(即unsigned char*)。为了写程序的方便,微软定义了类型LPTSTR,在MBCS下它表示char*,在Unicode下它表示unsigned char*,这就可以重定义一个宏进行不同字符集的转换了。

Unicode不管是英文字符还是中文字符都是采用双字节方式表示。Windows NT的所有与字符有关的函数都提供了两种方式的版本,而Windows 9x只支持ANSI方式。
_T一般同字符常量相关,如_T(“你好!”);。如果编码方式为ANSI,_T不起任何作用;如果编码方式为Unicode,编译器会把"你好!"以
Unicode方式进行保存。

_T和_L的区别:

_L不管是以什么方式编译,一律以Unicode方法保存。
L表示字符串资源采用Unicode编码方式,例:

wchar_t Str[]=L"Hello World!"; //每个字符都用2个字节来存储

_T是一个适配宏。当定义了_UNICODE时,_T和L相同;否则,_T的字符串采用ANSI编码方式。例:

LPTSTR lptStr=new TCHAR[32];TCHAR* szBuf=_T("Hello");以上两个语句,无论是在ANSI编码方式,还是在Unicode编码方式下都是正确的。

微软推荐使用相匹配的字符串函数。例如,在处理LPTSTR或LPCTSTR的时候,应该使用_tcslen来替代strlen函数。否则,在Unicode编码方式下,strlen不能处理wchar_t*的字符串。

T是一个非常重要的符号(TCHAR、LPTSTR、LPCTSTR、_T()和_TEXT()等),它表示使用一个中间类型,既不明确表示使用MBCS,也不明确表示使用Unicode。到底使用哪种字符集,在编译的时候才决定。

CString类型到LPTSTR类型的转换

CString path1;
LPTSTR path2=path1.GetBuffer(path1.GetLenght());

字符编码:

计算机只能处理数字,如果要处理文本,必须先把文本转换为数字才能处理。最早的计算机在设计时采用8个比特(bit)作为一个字节(byte),所以,一个字节能表示的最大的整数就是255(11111111)。
如果要表示更大的整数,就必须用更多的字节。比如两个字节可以表示的最大整数是65535,4个字节可以表示的最大整数是4294967295。

ASCII编码

由于计算机是美国人发明的,因此最早只有127个字母被编码到计算机里,也就是大小写英文字母、数字和一些符号,这个编码表被称为ASCII编码,比如大写字母 A 的编码是65,小写字母 z 的编码是122。但是处理中文时一个字节是不够的,至少需要两个字节,而且还不能和ASCII编码冲突,所以,中国制定了GB2312编码,用来把中文编进去。
全世界有上百种语言,各国有各国的标准,这样就会不可避免地出现冲突,结果就是,在多语言混合的文本中,显示出来会有乱码。

Unicode编码

为了解决乱码问题,于是出现了Unicode。Unicode把所有语言都统一到一套编码里,解决了乱码的问题。Unicode标准也在不断发展,但最常用的是用两个字节表示一个字符(如果要用到非常偏僻的字符,就需要4个字节)。现代操作系统和大多数编程语言都直接支持Unicode。

ASCII和Unicode的区别

1)ASCII编码是1个字节,而Unicode编码通常是2个字节,如:

字母 A 用ASCII编码是十进制的65,二进制的01000001;

字符 0 用ASCII编码是十进制的48,二进制的00110000,注意字符 ‘0’ 和整数 0 是不同的;

汉字中已经超出了ASCII编码的范围,用Unicode编码是十进制的20013,二进制的01001110 00101101。

如果把ASCII编码的 A 用Unicode编码,只需要在前面补0就可以,因此, A 的Unicode编码是00000000 01000001。

UTF-8编码
虽然统一成Unicode编码,乱码问题解决了。但如果一个文本基本上全部是英文的话,用Unicode编码比ASCII编码需要多一倍的存储空间,在存储和传输上就十分不划算。
因此,又把Unicode编码转化为“可变长编码”的UTF-8编码。UTF-8编码把一个Unicode字符根据不同的数字大小编码成1-6个字节,常用的英文字母被编码成1个字节,汉字通常是3个字节,只有很生僻的字符才会被编码成4-6个字节。如果传输的文本包含大量英文字符,用UTF-8编码就能节省空间:

字符A
ASCII 01000001
Unicode 00000000 01000001
UTF-8 01000001

UTF-8好处:
ASCII编码实际上可以被看成是UTF-8编码的一部分,所以,大量只支持ASCII编码的历史遗留软件可以在UTF-8编码下继续工作。

注意:
unicode是一种编码方式,和ascii是同一个概念,而UTF-8,UTF-16等是一种存储方式,在存储和传输上节约空间、提高性能的一种编码形式。

计算机系统通用的字符编码工作方式

在计算机内存中,统一使用Unicode编码,当需要保存到硬盘或者需要传输的时候,就转换为UTF-8编码。
用记事本编辑的时候,从文件读取的UTF-8字符被转换为Unicode字符到内存里,编辑完成后,保存的时候再把Unicode转换为UTF-8保存到文件:
浏览网页的时候,服务器会把动态生成的Unicode内容转换为UTF-8再传输到浏览器:
所以很多网页的源码上会有类似的信息,表示该网页正是用的UTF-8编码。

关于LPSTR、LPCSTR、LPTSTR和LPCTSTR相关推荐

  1. LPSTR/LPCSTR/LPTSTR/HWND/HANDLE/HMODULE/HINSTANCE 等含义和区别

    文章目录 辨别区分标志 Windows Data Types 含义 Reference 简 述: Windows 编程中常见的一些类型意义.区别和讲解定义 PVOID 和 LPVOID LPSTR / ...

  2. LPSTR, LPCSTR ,LPTSTR,LPCSTR,LPWSTR LPCWSTR

    LPCSTR       32-bit   指针,指向一个常量字串    LPSTR        32-bit   指针,指向一个字串    LPCTSTR      32-bit   指针,指向一 ...

  3. LPSTR LPCSTR LPTSTR LPCTSTR

    类型 标识 标识意义 说明 LPSTR 指针 指向一个字符串,每个字符占1字节 LPCSTR C 常量 指针 指向一个常字符串,每个字符占1字节  LPTSTR T 可变 指针 指向一个常字符串,每字 ...

  4. cstringw转lpctstr_CString 和 LPCTSTR 之间的转换 及 LPSTR、LPWSTR、LPCSTR、LPCWSTR、LPTSTR、LPCTSTR的区分与转化...

    CString 和 LPCTSTR 可以说通用. 原因在于CString定义的自动类型转换,没什么奇特的,最简单的C++操作符重载而已. 常量字符串ansi和unicode的区分是由宏_T来决定的.但 ...

  5. CString 和 LPCTSTR 之间的转换 及 LPSTR、LPWSTR、LPCSTR、LPCWSTR、LPTSTR、LPCTSTR的区分与转化

    欢迎大家有空可以看下我的http://ltdzhuwai.taobao.com 今天在写代码的时候碰到这样的问题,网上查了一下,做了以下整理: CString   和   LPCTSTR   可以说通 ...

  6. LPSTR、LPCSTR、LPTSTR和LPCTSTR的意义及区别

    1.ANSI(即MBCS):为多字节字符集,它是不定长表示世界文字的编码方式.ANSI表示英文字母时就和 ASCII一样,但表示其他文字时就需要用多字节. 2.Unicode:用两个字节表示一个字符的 ...

  7. LPSTR,LPCSTR,LPWSTR,LPCWSTR,LPTSTR,LPCTSTR转换

    LPSTR char* LPCSTR const char* LPWSTR                wchar_t* LPCWSTR const wchar_t* LPTSTR TCHAR* L ...

  8. LPSTR LPCSTR LPWSTR LPCWSTR区别

    LPSTR LPCSTR LPWSTR LPCWSTR区别 LPSTR   一个32位的指向字符串的指针      LPCSTR   一个32位的指向字符串常量的指针      LPWSTR   一个 ...

  9. LPSTR、LPWSTR、LPCSTR、LPCWSTR、LPTSTR、LPCTSTR的区分与转化

    首先在编译程序时经常会遇到这种问题: 错误 1 error C2664: "CWnd::MessageBoxW": 不能将参数 1 从"const char [3]&qu ...

最新文章

  1. MapReduce编程初体验
  2. 并查集 HDOJ 1232 畅通工程
  3. 《Adobe Flash Professional CC经典教程》——1.13 查找关于使用Flash的资源
  4. 用jquery修改默认的单选框radio或者复选框checkbox选择框样式
  5. java 随机数 【指定范围】
  6. 用php生成HTML文件的类
  7. 学python要什么基础-学Python首先要学什么?
  8. 打开网址自动跳转 php,HTML网页自动跳转的5种方法
  9. 98点人脸关键点检测算法
  10. [单片机框架][bsp层][AT32F415][bsp_adc] adc配置和使用
  11. Android 手机开机密码破解锁定
  12. c++ 调用c# dll修改win10锁屏背景
  13. 波卡的盔甲与弱肋 |链捕手
  14. 我学炒外汇 第十三篇影响瑞士法郎的因素
  15. 英文论文如何看?转自知乎
  16. java 有指针吗_java中到底有没有指针(转)
  17. Web 编程期中大作业
  18. vs全项目搜索关键词
  19. Android系统签名简介
  20. Matlab/ simulink仿真的直流配电网,图2为下垂控制仿真模型,图3为换流器(VSC)仿真模型

热门文章

  1. 上市公司匹配金融机构数据库-上市公司附近⾦融机构数量-2000-2022
  2. 【提高逻辑思维能力的好习惯】使用清晰、单一和直接的语言
  3. 开课吧python培训付款验证码
  4. 平面设计软件Corel CDR2023又开始放大招啦,CorelDRAW Graphics Suite 2023有哪些新增功能?
  5. 做前端的你还没用这些软件?? out 啦
  6. iOS反编译-hook微信之艾特所有人
  7. 记录一下MLP模型的应用_银行客户认购产品预测
  8. whois 如何查询到用户信息
  9. PYTHON爬取斗鱼英雄联盟所有在玩adc的主播房间信息
  10. HTML5 页面video标签视频加载播放空白