C++的中英文字符串表示(string,wstring) (转)
在 C++中字符串类的 string 的模板原型是 basic_string
template <class _Elem, class traits = char_traits<_Elem>, class _Ax =
allocator<_Elem>>
class basic_string{ };
第一个参数_Elem 表示类型。第二个参数 traits 的缺省值使用 char_traits 类型,
定义了类型和字符操作的函数,如比较、等价、分配等。第三个参数_Ax 的默认值
是 allocator 类,表示了内存模式,不同的内存结构将操作指针的不同行为,例如栈、
堆或段内存模式等。
在 C++标准里定义了两个字符串 string 和 wstring
typedef basic_string<char> string;
typedef basic_string<wchar_t> wstring;
前者 string 是常用类型,可以看作 char[],其实这正是与 string 定义中的
_Elem=char 相一致。而 wstring,使用的是 wchar_t 类型,这是宽字符,用于满足
非 ASCII 字符的要求,例如 Unicode 编码,中文,日文,韩文什么的。对于 wchar_t
类型,实际上 C++中都用与 char 函数相对应的 wchar_t 的函数,因为他们都是从同
一个模板类似于上面的方式定义的。因此也有 wcout, wcin, werr 等函数。
实际上 string 也可以使用中文,但是它将一个汉字写在 2 个 char 中。而如果将
一个汉字看作一个单位 wchar_t 的话,那么在 wstring 中就只占用一个单元,其它
的非英文文字和编码也是如此。这样才真正的满足字符串操作的要求,尤其是国际
化等工作。
看一下下面的程序,就会理解两者的差别。
#include <iostream>
#include <string>
using namespace std;
#define tab " "
int main()
{
locale def;
cout<<def.name()<<endl;
locale current = cout.getloc();
cout<<current.name()<<endl;
float val=1234.56;
cout<<val<<endl;