[C++]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 "\t"
- int main()
- {
- locale def;
- cout<<def.name()<<endl;
- locale current = cout.getloc();
- cout<<current.name()<<endl;
- float val=1234.56; cout<<val<<endl;
- //chage to french/france
- cout.imbue(locale("chs"));
- current=cout.getloc();
- cout<<current.name()<<endl;
- cout<<val<<endl;
- //上面是说明locale的用法,下面才是本例的内容,因为其中用到了imbue函数
- cout<<"*********************************"<<endl;
- //为了保证本地化输出(文字/时间/货币等),chs表示中国,wcout必须使用本地化解析编码
- wcout.imbue(std::locale("chs"));
- //string 英文,正确颠倒位置,显示第二个字符正确
- string str1("ABCabc");
- string str11(str1.rbegin(),str1.rend());
- cout<<"UK\ts1\t:"<<str1<<tab<<str1[1]<<tab<<str11<<endl;
- //wstring 英文,正确颠倒位置,显示第二个字符正确
- wstring str2=L"ABCabc";
- wstring str22(str2.rbegin(),str2.rend());
- wcout<<"UK\tws4\t:"<<str2<<tab<<str2[1]<<tab<<str22<<endl;
- //string 中文,颠倒后,变成乱码,第二个字符读取也错误
- string str3("你好么?");
- string str33(str3.rbegin(),str3.rend());
- cout<<"CHN\ts3\t:"<<str3<<tab<<str3[1]<<tab<<str33<<endl;
- //正确的打印第二个字符的方法
- cout<<"CHN\ts3\t:RIGHT\t"<<str3[2]<<str3[3]<<endl;
- //中文,正确颠倒位置,显示第二个字符正确
- wstring str4=L"你好么?";
- wstring str44(str4.rbegin(),str4.rend());
- wcout<<"CHN\tws4\t:"<<str4<<tab<<str4[1]<<tab<<str44<<endl;
- //只有char类型的string时才可以如此构造
- wstring str5(str1.begin(),str1.end());
- wstring str55(str5.rbegin(),str5.rend());
- wcout<<"CHN\tws5\t:"<<str5<<tab<<str5[1]<<tab<<str55<<endl;
- //如此构造将失败!!!!
- wstring str6(str3.begin(),str3.end());
- wstring str66(str6.rbegin(),str6.rend());
- wcout<<"CHN\tws6\t:"<<str6<<tab<<str6[1]<<tab<<str66<<endl;
- return 0;
- }
上面显示了本地化的作用,是在数字中每三位加一个逗号,其实对时间/文字等都是用影响的。
下面的输出说明了,如何正确使用string和wstring的方法。第三个因为使用string来表示汉字,出现了一些错误。最后一行也是错误,导致了输出也受到了影响,没有空格与回车。(最后两个就不要管中英文了,仅仅说明一下中文构造方法是错误的)
《掌握标准C++类》在第十二章《语言支持》中专门讲C++的国际化和本地化问题,C++提供了I18N的标准处理,软件开发者可以参考。 C++标准库还是非常博大精深的,功能比较齐全的。继续学习。
来自: http://hi.baidu.com/janvyking999/blog/item/fd5d44df572c3c5c94ee37de.html
[C++]C++标准里 string和wstring的更多相关文章
- 基于标准库实现string和wstring的转换
// convert string to wstring std::wstring to_wstring(const std::string& str, const std::locale&a ...
- string、wstring、cstring、 char、 tchar、int、dword转换方法(转)
string.wstring.cstring. char. tchar.int.dword转换方法(转) 最近编程一直头痛这集中类型的转化,明知都可以转却总是记不住,不断的上网查来查去,在这里小结 ...
- C++标准库<string>简单总结
C++标准库<string>简单总结 在C++中,如果需要对字符串进行处理,那么它自带的标准库<string>无疑是最好的选择,它实现了很多常用的字符处理函数. 要想使用标准C ...
- java里String类为何被设计为final
前些天面试遇到一个非常难的关于String的问题,"String为何被设计为不可变的"?类似的问题也有"String为何被设计为final?"个人认为还是前面一 ...
- 【C++ Primer每日刷】之三 标准库 string 类型
标准库 string 类型 string 类型支持长度可变的字符串.C++ 标准库将负责管理与存储字符相关的内存,以及提供各种实用的操作.标准库string 类型的目的就是满足对字符串的一般应用. 与 ...
- STL的string和wstring
STL有字符串处理类——stirng和wstring,但是用的时候会觉得不是很方便,因为它不能像TCHAR一样根据定义的宏在char类型字符串和wchar_t进行转换,总不能因为程序要Unicode就 ...
- C++标准库string类型
string类型支持长度可变的字符串,C++标准库将负责管理与存储字符相关的内存,以及提供各种有用的操作.标准库string类型的目的就是满足对字符串的一般应用. 本文地址:http://www.cn ...
- 深入理解c++中char*与wchar_t*与string以及wstring之间的相互转换 [转]
本篇文章是对c++中的char*与wchar_t*与string以及wstring之间的相互转换进行了详细的分析介绍,需要的朋友参考下. #ifndef USE_H_ #define USE_H_ # ...
- 深入理解c++中char*与wchar_t*与string以及wstring之间的相互转换
本篇文章是对c++中的char*与wchar_t*与string以及wstring之间的相互转换进行了详细的分析介绍,需要的朋友参考下-复制代码 代码如下: #ifndef USE_H_ ...
随机推荐
- iOS 图片循环滚动(切片效果)
#import <UIKit/UIKit.h> @interface AppDelegate : UIResponder <UIAp ...
- nginx 日志分析
Nginx中日志文件的格式在nginx.conf中定义,其默认格式如下: #vim /usr/local/nginx/conf/nginx.conf log_format acces ...
- 记32位程序(使用3gb用户虚拟内存)使用D3DX9导致的一个崩溃的问题
为了增加32位程序的用户虚拟内存的使用量,我们使用了/LARGEADDRESSAWARE编译选项来使32位程序可能使用到3gb的内存,能否使用到3gb内存也跟平台.系统和设置有关系,现摘抄部分作为参考 ...
- Hadoop2.2.0 第一步完成MapReduce wordcount计算文本数量
1.完成Hadoop2.2.0单机版环境搭建之后需要利用一个例子程序来检验hadoop2 的mapreduce的功能 //启动hdfs和yarn sbin/start-dfs.sh sbin/star ...
- Leetcode: Combination Sum IV && Summary: The Key to Solve DP
Given an integer array with all positive numbers and no duplicates, find the number of possible comb ...
- PPTP部署文档
PPTP部署文档 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 欢迎加入:高级运维工程师之路 598432640 前言:这款VPN部署起来特别简单,想对OPENVON配 ...
- 如何为 Eclipse 中的 Java 源文件设置为 UTF-8 默认编码(转)
要让一个 Java 源文件打开时编码格式为 UTF-8,需要做2件事情: 1)设置Java 源文件的默认编码格式为UTF-8: 2)设置workspace的编码格式为UTF-8. 相应设置如下: 设置 ...
- paper 23 :Kullback–Leibler divergence KL散度(2)
Kullback–Leibler divergence KL散度 In probability theory and information theory, the Kullback–Leibler ...
- 夺命雷公狗---微信开发57----微网站之jquery_mobile之入门案例
这节课我们主要用到到jquery_mobile来实现一个点电影播放网站 jquery_mobile(简称JQM)其实就是基于jquery开发出来的一套移动端框架,适应移动用户端市场对浏览与体验从而进一 ...
- CCS3属性之text-overflow:ellipsis;的用法和注意之处
语法: text-overflow:clip | ellipsis 默认值:clip 适用于:所有元素 clip: 当对象内文本溢出时不显示省略标记(...),而是将溢出的部分裁切掉. ellipsi ...