字符串,wchar_t, char,string,wstring

来源:互联网 发布:jquery1.11.1.js下载 编辑:程序博客网 时间:2024/05/22 09:03

昨天晚上在看字符串的时候觉得有必要整理一下;

(一)首先 看看C++中对(char,wchar_t,TCHAR) 的定义

数据类型char具有双重目的,它指定1字节变量,可以使用这种变量存储给定值域内的整数,或者存储单个ASCII 字符的代码;

char  letter = 'A';  //注意这个地方是 单引号;

由于 'A' 是由ASCII 码表示的十进制数的65,因此可以把上一句话写成 char letter = 65;

对于Visual C++ 来说可以存储在char型变量中的整数返回为 -128--127

 

类型 wchar_t 的叫法源自于宽字节类型(wide character type  适用于unicode编码),这种类型的变量可以存储2字节字符代码,值域为0-65535,

wchar_t letter = L'Z';  //‘Z’前面的L告诉编译器这是一个16位字符代码值;  wchar_t letter = 0x5A;

 

TCHAR是一个宏,在ANSI坏境下定义为char,unicode坏境下定义为wchar_t。

那么 一串字符是组合成单个实体的一系列char型值;

 

(二)字符数组和字符串

A) char类型的数组被称作字符数组,通常用来存储字符串。字符串是附加有特殊字符(字符串结尾标志  '\0' 占用一字节0x00,其8为全是0)的字符序列,

字符和字符数组区别:

      a)  char  letter = 'A'; //单引号.

      b)  char  name[] = "Albert Einstein"; //双引号.

同理可得 wchar letter = "Albert Einstein";  //不同的编码. (字符串结尾标志 \0'  双字节 0x0000)

 

B) C++ 提供了两种字符串的表示方法:1) c风格的字符串   2) 标准c++引入的string类类型。 

 1) c风格的字符串:

c风格的字符串存储在一个字符数组中,一般通过一个char *类型指针操纵它。系统内部实际上是存储在一个字符串数组中,然后,p 指向数组的第一个元素:

char *p = ”Albert Einstein”;

wchar_t *p = ”Albert Einstein”;

可以看出p实质就是一个指针,指向一个字符型数组首地址;

char p_str[] = ”Albert Einstein”;

p = p_str;

 

我们看看常见的几个宏:(这里借鉴别人的例子)

      (例) 一个字符串,比如说"北京2008",对应ANSI编码表示为 const char * cha = "北京2008";  unicode编码表示为 const wchar_t * wcha = L"北京2008"; 。

在内存里以二进制存储,ANSI编码对应为 0x B1B1 BEA9 32 30 30 38,unicode编码为 0x 1753 AC4E 3200 3000 3000 3800。

 

有了这个例子,对于宏

     const TCHAR *可以用来在不同的环境下表示字符串;

     LPSTR : long point string, 相当于char *;    

     LPCSTR: long point const string, 相当于 const char *;

     LPCWSTR: long point const wide string, 相当于 const wchar_t *;

     LPCTSTR: 类似的,相当于 const TCHAR *;

 

 2)字符串类型String 类

     C++标准库对此进行支持。

     使用string类,必须包含头文件: #include<string>

在C++标准里定义了两个字符串string和wstring   

    typedef basic_string<char> string;
    typedef basic_string<wchar_t> wstring;

     string str = "Albert Einstein";

    wstring wstr = L"Albert Einstein";

//可以把一个c风格的字符串转换成string类对象

char * p;

string str = p;

//把String 类对象转换成 C风格字符串

const char* p= str.c_str();

但是对于 unicode 编码的字符串:就得采用先转换为string  或者 char*

wstring转换为string:
wstring wstr=_T("这个世界很奇怪");
int size=WideCharToMultiByte(CP_ACP,0,wstr.c_str(),-1,NULL,0,NULL,NULL);
char *ch=new char[size+1];
if(!WideCharToMultiByte(CP_ACP,0,wstr.c_str(),-1,ch,size,NULL,NULL))
{
    return false;
}
string str=ch;

wchar_t*转换为char*:
wchar_t *wch=_T("这个世界很奇怪");
int size=WideCharToMultiByte(CP_ACP,0,wch,-1,NULL,0,NULL,NULL);
char *ch=new char[size+1];
if(!WideCharToMultiByte(CP_ACP,0,wch,-1,ch,size,NULL,NULL))
{
    return false;
}

然后再利用 string 和 char*  之间的关系进行转换;

到此就介绍完C++中关于字符的基本知识;

下一篇会介绍字符的运用;