鱼C论坛

 找回密码
 立即注册

Windows下字符的相关总结

热度 1已有 550 次阅读2016-5-14 23:00 |个人分类:Windows相关


1. 两种字符集:
Windows使用两种字符集ANSI和UNICODE,前者就是通常使用的单字节方式,1个字符用1个字节存储,这种方式处理像中文这样的双字节字符不方便,容易出现半个汉字的情况。而后者是双字节方式,1个字符用两个字节存储,方便处理双字节字符。使用何种字符集,在VS中可以修改,从VS2005之后,C++项目默认编码方式是UNICODE方式。分别使用char和wchar_t来表示ANSI和UNICODE原始字符类型。

2. 两种不同的字符串:
ANSI字符串:
char path[MAX_PATH] = "c:\\Users\\Sam.zhen\\lua.dat";
UNICODE字符串:
wchar_t path[MAX_PATH] = L"c:\\Users\\Sam.zhen\\lua.dat";
L是表示字符串资源为Unicode的

自适应字符串:
TCHAR  path[MAX_PATH] = _T("c:\\Users\\Sam.zhen\\lua.dat");
_T是一个宏:在ANSI模式下:
#define __T(x)      x
在UNICODE模式下:
#define __T(x)      L ## x
也就是说:_T(x) 的行为是:在ANSI模式下,什么都不作。在UNICODE模式下,则表示字符串是UNICODE模式的。

3. 各种数据类型和他们的含义: 
char, wchar_t, CHAR, WCHAR, TCHAR, LPSTR, LPCSTR,LPWSTR, LPCWSTR, LPTSTR, LPCTSTR...
这如此之多的数据类型,他们的含义到底如何。下面分解之。

3.1: 字符类型:
char:  字符型,是C语言标准数据类型。 由编译器决定这个类型是几个字节组成。通常情况为一个字节。
CHAR: Windows定义的字符类型,它与char相同。
WCHAR: UNICODE字符,每个字符由两个字节组成。
TCHAR:如果当前字符集是ANSI,则等同于CHAR. 如果当前字符集是UNICODE,则等同于WCHAR.

3.2: 字符串指针类型:
LPSTR: 一个32bit的指向CHAR字符串的指针。typedef CHAR* LPSTR;  等于CHAR* , 即等于char*.

LPCSTR: 一个32bit的指向CHAR字符串常量的指针. typedef CONST CHAR *LPCSTR 即等于const char*

LPWSTR:一个32bit的指向UNICODE字符串的指针。  typedef  WCHAR  *LPWSTR. 即等于 wchar_t*

LPCWSTR:一个32bit的指向UNICODE字符串常量的指针。 typedef  CONST WCHAR *LPCWSTR. 即等于const wchar_t*

LPTSTR: 一个32bit的指针。ANSI字符集下,指向CHAR字符串,UNICODE模式下,指向UNICODE字符串

LPCTSTR:一个32bit的指针。ANSI字符集下,指向CHAR字符串常量,UNICODE模式下,指向UNICODE字符常量。

L:表示LONG.
P: 指针。
W: wide.
T: _T 
C: Const.



4. 各类型之间的转化:
利用sprintf, wsprintf中的 %S。
When used with printf functions, specifies a wide-character string; when used with wprintf functions, specifies a single-byte–character string. Characters are printed up to the first null character or until the precision value is reached.
可以将其相互转换:
CHAR aString[MAX_PATH] = "Sam Info: ANSI Success. 1280x720";
TCHAR tString[MAX_PATH] = _T("Sam Info: T Success. 1280x720");
WCHAR wString[MAX_PATH] = L"Sam Info: UNICODE Success. 1920x1080";
CHAR aString1[MAX_PATH] = {0};
WCHAR wString1[MAX_PATH] = {0};

printf("\nANSI String: [%s]", aString);
_tprintf(_T("\nT String:[%s]"), tString);
wprintf(L"\nUNICODE String:[%s]", wString);

sprintf(aString1, "%S", wString);
swprintf(wString1, L"%S", aString);
printf("\nUNICODE 2 ANSI String: [%s]", aString1);
wprintf(L"\nANSI 2 UNICODE String:[%s]", wString1);

5. 比较和cat:
int strcmp( const char *string1, const char *string2 ); 
int wcscmp( const wchar_t *string1, const wchar_t *string2 ); 

char *strcat( char *strDestination, const char *strSource ); 
wchar_t *wcscat( wchar_t *strDestination, const wchar_t *strSource ); 


6. 取得长度:
size_t strlen( const char *str ); 
size_t wcslen( const wchar_t *str ); 
注意:此处返回的size是字符串的字母个数。而不是字符串字节长度。wcslen()在这方面是有差别的。
字符串长度两倍于字母个数。

int lstrlen(LPCTSTR lpString );它能得到LPCTSTR的长度。也是字符个数。

路过

雷人

握手
1

鲜花

鸡蛋

刚表态过的朋友 (1 人)

发表评论 评论 (1 个评论)

回复 zzxhh628 2022-4-8 17:14
不错,支持。

facelist

您需要登录后才可以评论 登录 | 立即注册

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2025-7-6 13:32

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

返回顶部