Windows数据类型,Windows程序字符集知识总结

此文章是根据如下文章和自己的思考总结归纳整理出来的:

https://www.cnblogs.com/zhangdongsheng/archive/2011/08/16/2141513.html

http://www.voidcn.com/article/p-chwlarat-hs.html

字符集

首先要知道通常Windows平台下的程序设计可以支持ANSI和UNICODE两种编码方法的字符串(Windows95 、98上不支持UNICODE标准)。

  1. ANSI:即多字节字符集(Multi-Byte Character System),它是编码的一种类型,而不是某个特定编码的名称。它是不定长表示世界文字的编码方式。ANSI编码表示英文字符时用一个字节(同ASCII编码),表示其他文字时就需要使用多字节(表示中文时用两个字节)。
  2. Unicode:用两个字节表示一个字符的编码方式。比如字符'A'在ASCII下面用一个字节表示,而在Unicode下面用两个字节表示,其中高字节用“0”填充。Unicode是定长表示世界文字的编码方式,据统计,用两个字节可以编码现存的所有文字而没有二义。

在visual studio中,可以再这里设置字符集

WINDOWS数据类型

VC++中的char,wchar_t,TCHAR

大家一起做一个项目,经常发现有的人爱用strcpy等标准ANSI函数,有的人爱用_tXXXX函数,这个问题曾经搞的很混乱。为了统一,有必要把来龙去脉搞清楚。

为了搞清这些函数,就必须理请几种字符类型的写法。char就不用说了,先说一些wchar_t。wchar_t是Unicode字符的数据类型,它实际定义在<string.h>里:

typedef unsigned short wchar_t;


不能使用类似 strcpy这样的ANSI C字符串函数来处理wchar_t字符串,必须使用wcs前缀的函数,例如wcscpy。为了让编译器识别Unicode字符串,必须以在前面加一个 “L”,例如:

wchar_t *szTest=L"This is a Unicode string.";

下面在看看TCHAR。如果你希望同时为ANSI和Unicode编译的源代码,那就要include TChar.h。TCHAR是定义在其中的一个宏,它视你是否定义了_UNICODE宏而定义成char或者wchar_t。如果你使用了TCHAR,那么就不应该使用ANSI的strXXX函数或者Unicode的wcsXXX函数了,而必须使用TChar.h中定义的_tcsXXX函数。另外,为了解决刚才提到带“L”的问题,TChar.h中定义了一个宏:“_TEXT”。

以strcpy函数为例子,总结一下:
.如果你想使用ANSI字符串,那么请使用这一套写法:

char szString[100];
strcpy(szString,"test");


.如果你想使用Unicode字符串,那么请使用这一套:

wchar_t szString[100];
wcscpyszString,L"test");


.如果你想通过定义_UNICODE宏,而编译ANSI或者Unicode字符串代码:

TCHAR szString[100];
_tcscpy(szString,_TEXT("test"));

字符串及处理:使用TCHAR系列方案

使用TCHAR系列方案编写程序
  TCHAR是一种字符串类型,它让你在以MBCS和UNNICODE来build程序时可以使用同样的代码,不需要使用繁琐的宏定义来包含你的代码。
      TCHAR的引入,主要是在Tchar.h文件中,该文件包含这方面的重要的定义信息。
      对于包含了对str函数或wcs函数进行显式调用的代码来说,无法非常容易地同时为ANSI和Unicode对这些代码进行编译。本章前面说过,可以创建同时为ANSI和Unicode进行编译的单个源代码文件。若要建立双重功能,必须包含TChar.h文件,而不是包含String.h文件。
      TChar.h文件的唯一作用是帮助创建ANSI/Unicode通用源代码文件。它包含你应该用在源代码中的一组宏,而不应该直接调用str函数或者 wcs函数。如果在编译源代码文件时定义了_UNICODE,这些宏就会引用wcs这组函数。如果没有定义_UNICODE,那么这些宏将引用str这组宏。
      TCHAR的定义如下:

      #ifdef UNICODE
      typedef wchar_t TCHAR;
      #else
      typedef char TCHAR;
      #endif


      所以用MBCS来build时,TCHAR是char,使用UNICODE时,TCHAR是wchar_t。
      还有一个宏来处理定义Unicode字符串常量时所需的L前缀。

      #ifdef UNICODE
      #define _T(x) L##x
      #define _TEXT(x) L##x
      #define __T(x) L##x
      #else
      #define _T(x) x
      #define _TEXT(x) x
      #define __T(x) x
      #endif


     ## 是一个预处理操作符,它可以把两个参数连在一起。如果你的代码中需要字符串常量,在它前面加上_T宏。如果你使用Unicode来build,它会在字符串常量前加上L前缀。
      TCHAR szNewText[] = _T("we love Bob!");
    _UNICODE宏用于C运行期头文件,而UNICODE宏则用于Windows头文件。当编译源代码模块时,通常必须同时定义这两个宏。
  像是用宏来隐藏SetWindowTextA/W的细节一样,还有很多可以供你使用的宏来实现str***()和_mbs***()等字符串函数。例如,你可以使用_tcsrchr宏来替换strrchr()、_mbsrchr()和wcsrchr()。_tcsrchr根据你预定义的宏是_MBCS还是 UNICODE来扩展成正确的函数,就象SetWindowText所作的一样。
   不仅str***()函数有TCHAR宏。其他的函数如, _stprintf(代替sprinft()和swprintf()),_tfopen(代替fopen()和_wfopen())。 MSDN中"Generic-Text Routine Mappings."标题下有完整的宏列表。

下面来解释下几个指针类型的具体意思:

LPSTR: 32-bit指针指向一个字符串,每个字符占1字节。相当于char *

LPCSTR:: 32-bit指针指向一个常量字符串,每个字符占1字节。相当于const char *

LPTSTR: 32-bit指针每字符可能占1字节或2字节,取决于Unicode宏是否定义。相当于TCHAR *(或_TCHAR *)

LPCTSTR: 32-bit指针指向一个常量字符串,每字符可能占1字节或2字节,取决于Unicode宏是否定义。相当于const THCAR *(或const _TCHAR *)

LPWSTR: 32-bit指针指向一个Unicode字符串的指针,每个字符占2字节。相当于wchar_t *

LPCWSTR: 32-bit指针指向一个Unicode字符串常量的指针,每个字符占2字节。相当于const wchar_t *


LPBYTE: 32-bit指针指向一个字节的指针,相当于unsigned char * 

 

(L表示long, P表示pointer,C表示constant,,T表示指针指向的字符占的字节数取决于Unicode是否定义——即_T宏,W表示wide,STR就是string的意思)

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值