TCHAR、wchar_t、char及字符串处理函数区别
wchar_t的类型定义
wchar_t的类型定义【wchar_t的类型定义】在C++语言中,wchar_t是一种用于表示宽字符的数据类型。
它是宽字符类型的一种实现方式,用于在多语言编程中支持特定字符集的编码方式,例如Unicode编码。
wchar_t类型的定义可以根据不同的编译器和平台而有所不同,下面将一步一步回答有关wchar_t类型定义的问题。
一、wchar_t的基本介绍wchar_t是一种用于表示宽字符的数据类型,它至少能够容纳一个本地字符集的所有字符。
宽字符类型在处理多语言编程中的字符串以及特殊字符时非常有用,因为它可以支持更广泛的字符范围。
二、wchar_t的大小wchar_t类型占据的字节大小在不同平台和编译器中可以有所不同。
这是因为不同平台对wchar_t类型的实现方式可能会有所差异。
在大多数平台中,wchar_t 类型占据2个或4个字节的空间。
三、wchar_t类型的字面常量wchar_t类型的字面常量可以使用L前缀加上单引号或双引号来表示,例如L'X'或L"Hello, World!"。
这样做是为了告诉编译器这是一个宽字符的常量。
四、wchar_t类型的标准库函数wchar_t类型在C++标准库中定义了一系列用于处理宽字符字符串的函数。
这些函数以"w"开头,例如wprintf()、wscanf()、wcslen()等。
这些函数是对应于普通的char类型字符串函数的宽字符版本。
五、wchar_t类型的宽字符编码方式wchar_t类型在不同编译器和平台中可能使用不同的宽字符编码方式。
常见的宽字符编码方式有UTF16和UTF32。
UTF16是以16位无符号整数来表示每个字符,而UTF32是以32位无符号整数来表示每个字符。
这些编码方式使得wchar_t 类型可以表示更广泛的字符范围。
六、wchar_t类型的使用注意事项在使用wchar_t类型时,需要注意的是,它只能在支持宽字符的编译器和平台上使用。
wchar_t,char,string,wstring之间的相互转换
wchar_t,char,string,wstring之间的相互转换在处理中⽂时有时需要进⾏wchar_t,char,string,wstring之间的转换。
其中char和string之间、wchar_t和wstring之间的转换较为简单,代码在vs2010下测试通过。
复制代码代码如下:#include <iostream>#include <string>#include <tchar.h>#include <Windows.h>using namespace std;//Converting a WChar string to a Ansi stringchar *w2c(char *pcstr,const wchar_t *pwstr, size_t len){int nlength=wcslen(pwstr);//获取转换后的长度int nbytes = WideCharToMultiByte( 0, 0, pwstr, nlength, NULL,0,NULL, NULL );if(nbytes>len) nbytes=len;// 通过以上得到的结果,转换unicode 字符为ascii 字符WideCharToMultiByte( 0,0, pwstr, nlength, pcstr, nbytes, NULL, NULL );return pcstr ;}int main(){setlocale(LC_ALL,"chs");char* cc = "this is a char 测试";wchar_t* wcc = L"this is a wchar 测试";string str("this is a string 测试 ");wstring wstr = L"this is a wstring 测试";//string to charconst char* char_test = str.c_str();//cout<<"char_test:"<<char_test<<endl;//char to stringstring ss = cc;//cout<<"ss is :"<<ss<<endl;//wstring to wcharconst wchar_t* wchar_test = wstr.c_str();//wcout<<wchar_test<<endl;//wchar to wstringwstring wss = wcc;wcout<<wcc<<endl;//char to wchar_twchar_t *wc = new wchar_t[str.size()+1];//swprintf(wc,L"%S",cc);//wcout<<cc<<endl;delete []wc;// wchar_t to charchar *pcstr = (char *)malloc(sizeof(char)*(2 * wcslen(wcc)+1));memset(pcstr , 0 , 2 * wcslen(wcc)+1 );w2c(pcstr,wcc,2 * wcslen(wcc)+1) ;free(pcstr);system("pause"); return 1;}。
C++中的字符串类型
C++中的字符串类型 本⼈c++新⼿,最近⽤C++,发现c++⾥⾯需要处理的字符串类型让我头疼,通过查阅资料,总结在此,供⽇后查阅,也请前辈不吝赐教,指出不⾜。
1.字符(串)表⽰分类 C++提供了两种字符串的表⽰形式,即C风格的字符串和标准字符串。
C++引⼊的是string 类类型,但实际上在许多程序的情形中我们有必要理解和使⽤⽼式的C 风格字符串。
总共包括以下⼏种类型: a.char b.wchar_t c.TCHAR c.LPSTR d.LPCSTR e.LPTSTR f.LPCTSTR g.Cstring h.string i.BSTR2.C风格字符串 C 风格的字符串起源于C 语⾔并在C++中继续得到⽀持,实际上在标准C++之前除了第三⽅字符串库类之外它是惟⼀⼀种被⽀持的字符串。
字符串被存储在⼀个字符数组中,⼀般通过⼀个char*类型的指针来操纵它,标准C 库为操纵C 风格的字符串提供了⼀组函数例如:// 返回字符串的长度int strlen( const char* );// ⽐较两个字符串是否相等int strcmp( const char*, const char* );// 把第⼆个字符串拷贝到第⼀个字符串中char* strcpy(char*, const char* );标准C 库作为标准的C++的⼀部分被包含在其中为使⽤这些函数我们必须包含相关的C 头⽂件#include <cstring>指向C 风格字符串的字符指针总是指向⼀个相关联的字符数组,即使当我们写⼀个字符串常量时,如:const char *st = "The expense of spirit\n";系统在内部也把字符串常量存储在⼀个字符串数组中,然后st 指向该数组的第⼀个元素。
那么我们怎样以字符串的形式来操纵st 呢?⼀般地我们⽤指针的算术运算来遍历C 风格的字符串,每次指针增加1 直到到达终⽌空字符为⽌例如:while ( *st++ ) { ... }char*类型的指针被解除引⽤并且测试指向的字符是true 还是false 。
C标准库中转换wchar_t和char类型的字符串
C标准库中转换wchar_t和char类型的字符串C 库函数 - mbstowcs()描述C 库函数 size_t mbstowcs(schar_t *pwcs, const char *str, size_t n) 把参数 str 所指向的多字节字符的字符串转换为参数 pwcs 所指向的数组。
声明下⾯是 mbstowcs() 函数的声明。
size_t mbstowcs(schar_t *pwcs, const char *str, size_t n)参数pwcs -- 指向⼀个 wchar_t 元素的数组,数组长度⾜以存储⼀个最⼤字符长度的宽字符串。
str -- 要被转换的多字节字符字符串。
n -- 要被转换的最⼤字符数。
返回值该函数返回转换的字符数,不包括结尾的空字符。
如果遇到⼀个⽆效的多字节字符,则返回 -1 值。
C 库函数 - wcstombs()描述C 库函数 size_t wcstombs(char *str, const wchar_t *pwcs, size_t n) 把宽字符字符串 pwcs 转换为⼀个 str 开始的多字节字符串。
最多会有 n 个字节被写⼊ str 中。
声明下⾯是 wcstombs() 函数的声明。
size_t wcstombs(char *str, const wchar_t *pwcs, size_t n)参数str -- 指向⼀个 char 元素的数组,⾄少有 n 字节长。
pwcs -- 要被转换的宽字符字符串。
n -- 要被写⼊到 str 中的最⼤字节数。
返回值该函数返回转换和写⼊到 str 中的字节数,不包括结尾的空字符。
如果遇到⼀个⽆效的多字节字符,则返回 -1 值。
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"));2.字符串及处理之三: 使用TCHAR系列方案使用TCHAR系列方案编写程序TCHAR是一种字符串类型,它让你在以MBCS和UNNICODE来build程序时可以使用同样的代码,不需要使用繁琐的宏定义来包含你的代码。
tchar用法
tchar用法TCHAR用法TCHAR是Windows API中的一个数据类型,它是一个宏定义,可以根据编译器的不同而被定义为char或wchar_t类型。
在Windows编程中,TCHAR类型的使用非常广泛,本文将从不同的角度介绍TCHAR的用法。
一、TCHAR的定义TCHAR是一个宏定义,它的定义如下:#ifdef _UNICODEtypedef wchar_t TCHAR;#elsetypedef char TCHAR;#endif根据编译器的不同,TCHAR可以被定义为char或wchar_t类型。
如果编译器定义了宏_UNICODE,则TCHAR被定义为wchar_t类型;否则,TCHAR被定义为char类型。
二、TCHAR的作用TCHAR的作用是在不同的编译器和操作系统中实现代码的兼容性。
在Windows编程中,TCHAR类型的使用非常广泛,它可以用来表示字符、字符串、文件名等。
例如,如果我们要在Windows中打开一个文件,可以使用以下代码:TCHAR szFileName[MAX_PATH];GetOpenFileName(&ofn);在这个例子中,szFileName是一个TCHAR类型的数组,用来存储用户选择的文件名。
GetOpenFileName函数是Windows API中的一个函数,它可以打开一个文件选择对话框,让用户选择一个文件。
三、TCHAR与字符串在Windows编程中,TCHAR类型的字符串也非常常见。
我们可以使用TCHAR类型的字符串来表示文件名、路径名等。
例如,如果我们要在Windows中创建一个目录,可以使用以下代码:TCHAR szDirName[MAX_PATH];CreateDirectory(szDirName, NULL);在这个例子中,szDirName是一个TCHAR类型的字符串,用来表示要创建的目录名。
CreateDirectory函数是Windows API中的一个函数,它可以创建一个目录。
string、wstring、cstring、+char、+tchar、int、dword转换方法
int atoi(const char *nptr);
long atol(const char *nptr);
long long atoll(const char *nptr);
long long atoq(const char *nptr);
10》int转char*和string
CString strtest;
char * charpoint;
charpoint="give string a value";
strtest=charpoint; //直接付值
...................................................................
{
string result(cstr.GetLength(),'e');
for (int i=0;i<cstr.GetLength();i++)
{
result[i]=(char)cstr[i];
}
return result;
}
5》string转char *
a)char *p = string.c_str();
具体问题具体分析,浮云啊,一切皆是浮云.....
以下摘录自网络:
..............................................................
《C++标准函数库》中说的
有三个函数可以将字符串的内容转换为字符数组和C—string
1.data(),返回没有”/0“的字符串数组
string 转 CString
wchar_t,wchar_t,wchat_t数组,char,char,char数组
system("command")是执行一个dos命令。system("pause")就是执行Dos命令pause,等待用户输入。
system("pause") 与getchar()区别
system("pause") 是调用WINDOWS CONSOLE APP下的命令 PAUSE的。
关于wchar_t
在C++标准中,wchar_t是宽字符类型,每个wchar_t类型占2个字节,16位宽。汉字的表示就要用到wchar_t 。char,我们都知道,占一个字节,8位宽。
标准C++中的wprintf()函数以及iostream类库中的类和对象能提供wchar_t宽字符类型的相关操作。
pChar = const_cast<char*>(str.c_str());
cout << pChar << endl;
// 注:char* 转换 string
str = std::string(pChar);
// 注: cout 的 << 重载了string, 若printf 的话必须 printf("%s", str.c_str());
{
int nLength = MultiByteToWideChar( CP_ACP, 0, szStr.c_str(), -1, NULL, NULL );
wszStr.resize(nLength);
LPWSTR lpwszStr = new wchar_t[nLength];
MultiByteToWideChar( CP_ACP, 0, szStr.c_str(), -1, lpwszStr, nLength );
CHAR_TCHAR_WCHAR相关知识归档整理
CHAR, WCAHR, TCAHR 相关知识整理相关知识的收集整理,如有错误欢迎指正lf_kyo@ 标签:CHAR, WCAHR, TCAHR, LPSTR, LPCSTR, LPWSTR, LPCWSTR, LPTSTR, LPCTSTR, _T(“xx”), L”xx”1.先了解下相关宏定义: winnt.h中typedef char CHAR ;typedef wchar_t WCHAR ;#ifdef UNICODEtypedef wchar_t TCHAR ; //wchar_t C++: 16-bit UNICODE character#elsetypedef char TCHAR ;#endif即:CHAR为8位的char,WCHAR为16位的宽char,TCHAR为8位(未定义UNICODE)或 16位(定义了UNICODE) 说明:wchar_t在C++一般设定为16位,但有个别的库为32位将char ‐> wchar_t的方法:wchar_t appName[5] = TEXT(“test”); //TEXT() 即_T(),这里也等同于L。
2.相关类型指针说明C++类型 描述 等同于 编译环境 LPSTR 指向CHAR型字符串的指针 char* ANSILPCSTR 指向CHAR型字符串常量的指针 const char* ANSILPWSTR 指向WCHAR型字符串的指针 wchar_t* UNICODE LPCWSTR 指向WCHAR型字符串常量的指针 const wchat_t* UNICODE LPTSTR UNICODE环境下==LPWSTR, 非UNICODE环境下==LPSTRLPCTSTR UNICODE环境下==LPCWSTR, 非UNICODE环境下==LPCSTR相关宏定义#ifdef UNICODEtypedef LPWSTR LPTSTR ;typedef LPCWSTR LPCTSTR ;#elsetypedef LPSTR LPTSTR ;typedef LPCSTR LPCTSTR ;#endif类型名称定义说明L: 即long为与之前16位系统兼容,32位系统中无意义P: 即指针C: 即 constSTR: 即字符串3.区分UNICODE 和 ANSI环境UNICODE: #define UNICODE (可在头文件中添加)#define _UNICODEANSI: #define _MBCS说明:VS2005默认情况下设定为UNICODE, VC6.0为ANSI修改VS2005的UNICODE为非UNICODE设定的方法:工程‐>属性‐>1). Confinuration Properties‐>General‐>Character Set选择”Use Multi‐Byte charater set”.2). Confinuration Properties‐>c/c++‐>Preprocessor‐>Preprocessor Definitions‐>…下应为_MBCS 而非UNICODE _UNICODE . (另:如果有”Inherit from parent or project default”选项则不选择 )4.关于_T(“xxx”) 和 L”xxx”L: 标示使用 UNICODE编码_T(): 在非UNICODE环境下无意义,在UNICODE环境下等同于L._T()使用的几个简单示例TCHAR* szText = _T(“Hello”); //为字符串指针赋值TCHAR szText = _T(“Welcome”); //为字符串数组赋值LPCTSR lpszText = _T(“大家好”); //为字符串常量指针赋值5.相关使用的字符串操作函数ANSI操作函数以str开头:strcpy(); strcat(); strlen();等UNICODE … 以wcs开头:wcscpy(); wcscat(); wcslen();等ANSI/UNICODE通用…(C运行库)以_tcs开头:_tcscpy();等ANSI/UNICODE通用…(windows函数)以lstr开头:lstrcpy();等MFC中UNICODE环境下默认调用为 函数名+W 如:MessageBoxW();ANSI … 函数名+A 如:MessageBoxA();当源程序调用MessageBox时,编译器会根据实际环境进行调用。
CHAR与WCHAR处理函数
大小写转换:
宽字符函数 普通C函数描述
towlower() tolower() 把字符转换为小写
towupper() toupper() 把字符转换为大写
字符比较: 宽字符函数普通C函数描述
wcscoll() strcoll() 比较字符串
日期和时间转换:
宽字符函数描述
strftime() 根据指定的字符串格式和locale设置格式化日期和时间
wcsftime() 根据指定的字符串格式和locale设置格式化日期和时间, 并返回宽字符串
strptime() 根据指定格式把字符串转换为时间值, 是strftime的反过程
wcscspn() strcspn() 返回不包含第二个字符串的的初始数目
wcsspn() strspn() 返回包含第二个字符串的初始数目
wcscpy() strcpy() 拷贝字符串
wcsncpy() strncpy() 类似于wcscpy(), 同时指定拷贝的数目
fputws() fputs() 把宽字符串转换为多字节字符并且输出到标准输出串
getwc() getc()tchar() 从标准输入中读取字符, 并且转换为宽字符
None gets() 使用fgetws()
打印和扫描字符串:
宽字符函数描述
fprintf()/fwprintf() 使用vararg参量的格式化输出
fscanf()/fwscanf() 格式化读入
printf() 使用vararg参量的格式化输出到标准输出
scanf() 从标准输入的格式化读入
sprintf()/swprintf() 根据vararg参量表格式化成字符串
C++数据类型及其长度总结
C语言中数据类型的长度以及作用值域一个指针本身占用4个字节unsigned 用于修饰int 和char 类型。
它使int 或char 类型成为无符号类型。
signed 是unsigned 反义词,如signed int 表示有符号类型,不过signed可以省略,所以上面列出char,short int,int 都是有符号类型。
有short int (短整型) ,所以也就有对应long int (长整型)。
long int 用于表示4个字节(32位)的整数。
但是在我们现在普通使用的32位计算机中,int 默认就是4个字节,所以long也是可以省略的。
(较早几年,也就是Windows 3.1/DOS 流行的时候,那时的机器及操作系统都是16位的,这种情况下,int 默认是16位的。
此时,如果想实现32位整数,就必须定义为这样的类型:long int)。
在浮点数方面,我们最常用的将是double。
它的精度适合于我们日常中的各种运算。
当然,float的精度也在很多情况下也是符合要求的。
布尔型(bool)和无类型(void)除字符型,整型,实型以外,布尔型和无类型也是较常用的两种数据类型。
布尔型(bool)布尔类型是C++的内容,C语言没有这一类型。
布尔类型的数据只有两种值:true(真)或false(假)。
什么时候使用布尔型呢?履历表中一般有“婚否”这一项,婚否这种数据就适于用真或假来表示。
性别男女,有时也会用布尔值表示,(一般程序都不约而同地把男性设置“真”,女性设置为“假”。
)无类型(void)这个类型比较怪“无”类型。
是的,没有类型的类型。
或者我们这样认为比较好接受:在不需要明确指定类型的时候,我们可能使用void 来表示。
=============================================================================== ========================================================================================= ========================================================================================= ==========Visual C++常用数据类型转换详解本文将介绍一些常用数据类型的使用。
char,CHAR,TCHAR,LPSTR,LPCSTR,WCHAR ,CString
char是C语言标准数据类型,字符型,至于由几个字节组成通常由编译器决定,一般一个字节。
Windows为了消除各编译器的差别,重新定义了一些数据类型。
CHAR为单字节字符。
还有个WCHAR为Unicode字符,即不论中英文,每个字有两个字节组成。
如果当前编译方式为ANSI(默认)方式,TCHAR等价于CHAR,如果为Unicode方式,TCHAR等价于WCHAR。
LPCSTR 相当于CONST CHAR * 和LPSTR 相当于CHAR *。
TCHAR 与Char的区别:TCHAR是通过条件宏定义定义出来的类型。
如果定义了_UNICODE,TCHAR就是wchar_t,即unsigned short,否则,TCHAR就是char。
char,TCHAR,WCHAR区别#ifdef UNICODEtypedef wchar_t TCHAR;#elsetypedef unsigned char TCHAR;#endiftypedef unsigned char CHAR;typedef unsigned wchar_t WCHAR;由此可以看出,CHAR实施上就是unsigned char,WCHAR为宽字符,而TCHAR根据是否支持unicode而不同。
在程序使用sizeof(TCAHR),当默认设置时,这个值是1;当定义UNICODE宏时,这个值是2。
另外:CString与char之间的转换:char *buf;CString str=_T("renjingwei");buf=str.GetBuffer(10);另外给出MSDN中各个变量说明:BOOL A Boolean value.//这个BOOL和bool是有区别的,BOOL是个宏定义,是0或1(TRUE OR FALSE);而bool是布尔类型,可以是true or falsechar是C语言标准数据类型,字符型,至于由几个字节组成通常由编译器决定,一般一个字节。
浅谈c++字符类型总结区别wchar_t,char,WCHAR
浅谈c++字符类型总结区别wchar_t,char,WCHAR1、区别wchar_t,char,WCHARANSI:即 char,可⽤字符串处理函数:strcat( ),strcpy( ), strlen( )等以str打头的函数。
UNICODE:wchar_t是Unicode字符的数据类型,它实际定义在⾥:typedef unsigned short wchar_t;另外,在头⽂件中有这样的定义:typedef wchar_t WCHAR; 所以WCHAR实际就是wchar_twchar_t 可⽤字符串处理函数:wcscat(),wcscpy(),wcslen()等以wcs打头的函数。
为了让编译器识别Unicode字符串,必须以在前⾯加⼀个“L”,例如: wchar_t *szTest=L"This is a Unicode string.";2、TCHAR在C语⾔⾥⾯提供了 _UNICODE宏(有下划线),在Windows⾥⾯提供了UNICODE宏(⽆下划线),只要定了_UNICODE 宏和UNICODE宏,系统就会⾃动切换到UNICODE版本,否则,系统按照ANSI的⽅式进⾏编译和运⾏。
只定义了宏并不能实现⾃动的转换,他还需要⼀系列的字符定义⽀持。
1. TCHAR如果定义了UNICODE宏则TCHAR被定义为wchar_t。
typedef wchar_t TCHAR;否则TCHAR被定义为char typedef char TCHAR;2. LPTSTR如果定义了UNICODE宏则LPTSTR被定义为LPWSTR。
typedef LPTSTR LPWSTR;否则TCHAR被定义为char typedef LPTSTR LPSTR;说明:在使⽤字符串常量的时候需要使⽤_TEXT(“MyStr”)或者_T("")来⽀持系统的⾃动转换。
3、BSTRBSTR是⼀个带长度前缀的字符串,主要由操作系统来管理的,所以要⽤api.主要⽤来和VB打交道的(VB⾥的string就是指它)要操作它的API函数有很多.⽐如SysAllocString,SysFreeString等等.vc⾥封装它的类如_bstr_t,及ATL中的CComBSTR等.⼀个 BSTR 由头部和字符串组成,头部包含了字符串的长度信息,字符串中可以包含嵌⼊的 null 值。
String,CString,TCHAR,char之间区别和联系
#ifdef UNICODEtypedef wchar_t TCHAR;#elsetypedef unsigned char TCHAR;#endiftypedef unsigned char CHAR;typedef unsigned wchar_t WCHAR;由此可以看出,CHAR实施上就是unsigned char,WCHAR为宽字符,而TCHAR根据是否支持unicode而不同。
在程序使用sizeof(TCAHR),当默认设置时,这个值是1;当定义UNICODE宏时,这个值是2。
TCHAR是一种字符类型,它让你在以MBCS和UNNICODE来build程序时可以使用同样的代码,不需要使用繁琐的宏定义来包含你的代码,而char代表ASCII的字符所以用MBCS来build时,TCHAR是char,使用UNICODE时,TCHAR是wchar_t.至于String,CString他们都是一种封装了字串处理的操作!你可以打开他们的源代码找寻究竟!CString属于VC的类库string是标准C++的类库string.h是C的库函数。
类型char:单字节变量类型,最多表示256个字符。
wchar_t :宽字体变量类型,用于表示Unicode字符。
它实际定义在<string.h>里,typedef unsigned short wchar_t.为了让编译器识别Unicode字符串,必须在前面加一个“L”,定义宽字节类型的方法为:wchar_t c=L’A’;wchar_t *p=L”Hello!”;宽字节类型每个变量占用2个字节。
TEXTwindows头文件中提供了TEXT宏可以视UNICODE宏是否定义来自动切换由其定义的字符串,其定义大体如下:#ifdef UNICODE#define TEXT(s) L##s#else#define TEXT(s) s#endif##为宏定义中使用的拼接符研究它们的源代好些!TCHAR,char是可以同整型互换的类型。
c语言处理字符串的函数
在C语言中,处理字符串的函数众多,今天重点介绍几个常用的函数:1. char类型的函数:char类型是C语言中的基本数据类型,用于存储单个字符。
char类型的变量可以存储字符串,但是需要手动输入输出转换为字符串。
例如:```char a = 'C';printf("%c\n", a);```2. char*类型的函数:char*是字符指针,通常用于指向一个字符串(即字符数组)。
可以使用间接访问的方式输入输出字符串。
例如:```char *str = "Hello, World!";printf("%s\n", str);```3. char**类型的函数:char**是指向字符指针的指针,可以视为指针的数组,其中每个指针指向一个char数组(或字符串),通常用来表示一个字符串数组。
例如:```char **strs = {"Hello", "World", "in", "C"};for (int i = 0; i < 4; i++) {printf("%s\n", strs[i]);}```4. gets()函数:用来读取整行输入,直到遇到换行符,然后丢弃换行符,储存其余字符,并在字符末尾添加一个空字符。
例如:```char str[100];printf("请输入一个字符串:");gets(str);printf("%s\n", str);```5. fgets()函数:用来从文件中读取字符串,可以限制读取的字符数。
例如:```FILE *fp = fopen("test.txt", "r");char str[100];fgets(str, sizeof(str), fp);fclose(fp);printf("%s\n", str);```6. strlen()函数:用于获取字符串的长度,不包括字符串结束标志'\0'。
TCHAR用法
TCHAR⽤法TCHAR 就是当你的字符设置为什么就是什么例如:程序编译为 ANSI, TCHAR 就是相当于 CHAR当程序编译为 UNICODE, TCHAR 就相当于 WCHARchar :单字节变量类型,最多表⽰256个字符,wchar_t :宽字节变量类型,⽤于表⽰Unicode字符,它实际定义在<string.h>⾥:typedef unsigned short wchar_t。
为了让编译器识别Unicode字符串,必须以在前⾯加⼀个“L”,定义宽字节类型⽅法如下:wchar_t c = `A' ;wchar_t * p = L"Hello!" ;wchar_t a[] = L"Hello!" ;其中,宽字节类型每个变量占⽤2个字节,故上述数组a的sizeof(a) = 14TCHAR / _T( ) :如果在程序中既包括ANSI⼜包括Unicode编码,需要包括头⽂件tchar.h。
TCHAR是定义在该头⽂件中的宏,它视你是否定义了_UNICODE 宏⽽定义成:定义了_UNICODE: typedef wchar_t TCHAR ;没有定义_UNICODE: typedef char TCHAR ;#ifdef UNICODEtypedef char TCHAR;#elsetypede wchar_t TCHAR;#endif_T( )也是定义在该头⽂件中的宏,视是否定义了_UNICODE宏⽽定义成:定义了_UNICODE: #define _T(x) L##x没有定义_UNICODE: #define _T(x) x注意:如果在程序中使⽤了TCHAR,那么就不应该使⽤ANSI的strXXX函数或者Unicode的wcsXXX函数了,⽽必须使⽤tchar.h中定义的_tcsXXX函数⼀、在字符串前加⼀个L作⽤:如 L"我的字符串" 表⽰将ANSI字符串转换成unicode的字符串,就是每个字符占⽤两个字节。
wchar_t类型的几个函数
wchar_t类型的⼏个函数
wchar_t是C/C++的字符数据类型,是⼀种扩展的字符存储⽅式。
在Windows下,wchar_t占2个字节(byte);在下,wchar_t占4个字节
wchar_t类型主要⽤在国际化程序的实现中,但它不等同于Unicode编码。
Unicode编码的字符⼀般以wchar_t类型存储。
char是8位字符类型,最多只能包含256种字符,许多外⽂字符集所含的字符数⽬超过256个,char型⽆法表⽰。
标准C++中的wprintf()函数以及iostream类库中的类和对象能提供wchar_t宽字符类型的相关操作。
函数介绍:
wcslen() 类似与char*类型作参数的strlen()函数⽤来获取wchar_t*变量的长度(不包含终结符)
wcscpy() 类似与char*类型作参数的strcpy()函数⽤来进⾏wchar_t*变量之间的复制
同样的还有 wcsncpy()
wcscmp() 类似与char*类型的strcmp()函数⽤来对⽐两个wchar_t*变量的⼤⼩
wmemset() 类似与char*类型的memset()函数⽤来初始化内存
wprintf() 类似与char*类型的printf()函数⽤来输出wchar_t*字符串
简单记忆:
⼀般把char类型函数中的" str "替换为" wcs "即可
wcs:wide char string。
TCHAR——精选推荐
TCHAR
定义
TCHAR :通过define 定义的字符串宏
因为C++⽀持两种字符串:常规的ANSI编码(使⽤""包裹)、Unicode编码(使⽤L" "包裹)。
因此对应的有两套字符串处理函数。
⽐如:strlen 和 wcslen 分别⽤于处理两种字符串
使⽤
微软将这两套字符集及其操作进⾏了统⼀。
通过条件编译(_UNICODE 和 UNICODE宏)控制实际使⽤的字符集,因此出现了
_T(" ") 这样的字符串。
与之对应的就有了 _tcslen 这样的函数。
TCHAR 类型,就是⽤来存储这样的通⽤字符的。
当没有定义_UNICODE宏时,TCHAR = char , _tcslen = strlen
当定义了_UNICODE宏时,TCHAR = wchar_t , _tcslen = wcslen
当我们定义了UNICODE宏,就相当于告诉编译器:我要⽤UNICODE版本。
这时候,TCHAR就摇⾝⼀变,变成 wchar_t 类型。
⽽没有定义UNICODE 宏的时候,TCHAR 摇⾝⼀变,变成unsigned char 类型。
这样可以很好的切换 “宽窄”字符集。
TCHAR 可⽤于双字节字符串,使程序可以⽤于中、⽇、韩、等国语⾔⽂字处理、显⽰。
简化编程。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
一.ANSI和UNICODE
2.ANSI字符和Unicode字符
ANSI字符类型为CHAR,指向字符串的指针PSTR(LPSTR),指向一个常数字符串的指针PCSTR(LPCSTR);
对应的Windows定义的Unicode字符类型为WCHAR(typedef WCHAR wchar_t) ,指向Unicode字符串的指针PWSTR ,指向一个常数Unicode字符串的指针PCWSTR 。
2.通用字符串指针LPTSTR
LPTSTR
ifdef UNICODE it is LPWSTR(*wchar_t) for Unicode platforms;
else it is LPSTR (*char) for ANSI and DBCS platforms.
3.通用通用常数字符串指针LPCTSTR
LPCTSTR
ifdef UNICODE it is LPCWSTR(*const wchar_t) for Unicode platforms;
else it is LPCSTR (*const char)for ANSI and DBCS platforms.
将ANSI转换到Unicode
(1)通过L这个宏来实现,例如: CLSIDFromProgID( L"MAPI.Folder",&clsid);
(2)通过MultiByteToWideChar函数实现转换,例如:
char *szProgID = "MAPI.Folder";
WCHAR szWideProgID[128];
USES_CONVERSION;
CLSIDFromProgID( A2W(szProgID),&clsid);
将Unicode转换到ANSI
(1)使用WideCharToMultiByte,例如:
// 假设已经有了一个Unicode 串 wszSomeString...
char szANSIString [MAX_PATH];
WideCharToMultiByte ( CP_ACP, WC_COMPOSITECHECK, wszSomeString, -1, szANSIString, sizeof(szANSIString), NULL, NULL );
(2)使用W2A宏来实现,例如:
USES_CONVERSION;
ANSE”
ANSI/Unicode T(“string”)或_TEXT(“string”)
3.ANSI字符和Unicode字符串的操作
双字节(DBCS)字符集中,字符串的每个字符可以包含一个或两个字节。如果只是调用strlen()函数,那么你就无法知道字符串到底有多少个字符,它只能告诉你到达结尾的0之前有多少个字节。
以strcpy函数为例子,总结一下:
.如果你想使用ANSI字符串,那么请使用这一套写法:
char szString[100];
strcpy(szString,"test");
.如果你想使用Unicode字符串,那么请使用这一套:
wchar_t szString[100];
wcscpyszString,L"test");
Neutral ANSI/UNICODE types
1.通用字符型TCHAR
TCHAR
ifdef UNICODE it is wchar_t(WCHAR)for Unicode platforms;
else it is char for ANSI and DBCS platforms.
MBCS 操作函数以_mbs开头 _mbscpy
ANSI/Unicode 操作函数以_tcs开头 _tcscpy(C运行期库)
ANSI/Unicode 操作函数以lstr开头 lstrcpy(Windows函数)
二.ANSI/UNICODE通用字符/字符串类型TCHAR/LPTSTR/LPCTSTR
标准c中的strcpy,strchr,strcat等只能用于ANSI字符串,不能正确处理Unicode字符串,因此也提供了一组补充函数,功能等价,但用于Unicode码。我们来看看string .h字符串头文件中是怎样处理char*和wchar_t*两个字符串版本的:
char *strcat(char*,const char*);
.如果你想通过定义_UNICODE宏,而编译ANSI或者Unicode字符串代码:
TCHAR szString[100];
_tcscpy(szString,_TEXT("test"));
2, ANSI与Unicode
Unicode称为宽字符型字串,COM里使用的都是Unicode字符串。
CLSID clsid;
long lLen = MultiByteToWideChar(CP_ACP,0,szProgID,strlen(szProgID),szWideProgID,sizeof(szWideProgID));
szWideProgID[lLen] = '
(3)通过A2W宏来实现,例如:
wchar_t是Unicode字符的数据类型,它实际定义在<string.h>里:
typedef unsigned short wchar_t;
下面在看看TCHAR。如果你希望同时为ANSI和Unicode编译的源代码,那就要include TChar.h。TCHAR是定义在其中的一个宏,它视你是否定义了_UNICODE宏而定义成char或者wchar_t。如果你使用了TCHAR,那么就不应该使用ANSI的strXXX函数或者Unicode的wcsXXX函数了,而必须使用TChar.h中定义的_tcsXXX函数。另外,为了解决刚才提到带“L”的问题,TChar.h中定义了一个宏:“_TEXT”。
pTemp=W2A(wszSomeString);
wchar_t *wcschr(wchat_t*,const wchar_t *)
类似的还有strchr/wcschr,strcmp/wcscmp,strlen/wcslen etc.
ANSI 操作函数以str开头 strcpy
Unicode 操作函数以wcs开头 wcscpy
<3>Unicode与ANSI字符串的转换:Windows函数MultiByteToWideChar函数用于将多字节字符串转换成宽字符串,函数WideCharToMultiByte将宽字符串转换成等价的多字节字符串。
有的人爱用strcpy等标准ANSI函数,有的人爱用_tXXXX函数,有必要把来龙去脉搞清楚。为了搞清这些函数,就必须理请几种字符类型的写法。char就不用说了,先说一些wchar_t。wchar_t是Unicode字符的数据类型,它实际定义在<string.h>里:
typedef LPWSTR LP;
#define __TEXT(quote) L##quote // r_winnt
<1>_UNICODE宏用于C运行期头文件,UNICODE宏则用于Windows头文件,当编译代码模块时,通常必须同时定义这两个宏。
<2>如果定义了_UNICODE,若要生成一个Unicode字符串,字符串前要加L宏,用于告诉编译器该字符串应该作为Unicode字符串来编译处理。但是这样又有个问题就是如果没有定义_UNICODE则编译出错。为了解决这个问题我们必须用到_TEXT宏,这个宏也在TChar.h中做了定义。使用该宏后,无论源文件有没有定义_UNICODE都不会出现编译错误。
typedef unsigned short wchar_t;
不能使用类似strcpy这样的ANSI C字符串函数来处理wchar_t字符串,必须使用wcs前缀的函数,例如wcscpy。为了让编译器识别Unicode字符串,必须以在前面加一个“L”,例如:
wchar_t *szTest=L"This is a Unicode string."