[C++]C++标准里 string和wstring

时间:2023-01-23 12:31:47

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中就只占用一个单元,其它的非英文文字和编码也是如此。这样才真正的满足字符串操作的要求,尤其是国际化等工作。 
     看一下下面的程序,就会理解两者的差别。

  1. #include <iostream>
  2. #include <string>
  3. using namespace std;
  4. #define tab "\t"
  5. int main()
  6. {
  7. locale def;
  8. cout<<def.name()<<endl;
  9. locale current = cout.getloc();
  10. cout<<current.name()<<endl;
  11. float val=1234.56;      cout<<val<<endl;
  12. //chage to french/france
  13. cout.imbue(locale("chs"));
  14. current=cout.getloc();
  15. cout<<current.name()<<endl;
  16. cout<<val<<endl;
  17. //上面是说明locale的用法,下面才是本例的内容,因为其中用到了imbue函数
  18. cout<<"*********************************"<<endl;
  19. //为了保证本地化输出(文字/时间/货币等),chs表示中国,wcout必须使用本地化解析编码
  20. wcout.imbue(std::locale("chs"));
  21. //string 英文,正确颠倒位置,显示第二个字符正确
  22. string str1("ABCabc");
  23. string str11(str1.rbegin(),str1.rend());
  24. cout<<"UK\ts1\t:"<<str1<<tab<<str1[1]<<tab<<str11<<endl;
  25. //wstring 英文,正确颠倒位置,显示第二个字符正确
  26. wstring str2=L"ABCabc";
  27. wstring str22(str2.rbegin(),str2.rend());
  28. wcout<<"UK\tws4\t:"<<str2<<tab<<str2[1]<<tab<<str22<<endl;
  29. //string 中文,颠倒后,变成乱码,第二个字符读取也错误
  30. string str3("你好么?");
  31. string str33(str3.rbegin(),str3.rend());
  32. cout<<"CHN\ts3\t:"<<str3<<tab<<str3[1]<<tab<<str33<<endl;
  33. //正确的打印第二个字符的方法
  34. cout<<"CHN\ts3\t:RIGHT\t"<<str3[2]<<str3[3]<<endl;
  35. //中文,正确颠倒位置,显示第二个字符正确
  36. wstring str4=L"你好么?";
  37. wstring str44(str4.rbegin(),str4.rend());
  38. wcout<<"CHN\tws4\t:"<<str4<<tab<<str4[1]<<tab<<str44<<endl;
  39. //只有char类型的string时才可以如此构造
  40. wstring str5(str1.begin(),str1.end());
  41. wstring str55(str5.rbegin(),str5.rend());
  42. wcout<<"CHN\tws5\t:"<<str5<<tab<<str5[1]<<tab<<str55<<endl;
  43. //如此构造将失败!!!!
  44. wstring str6(str3.begin(),str3.end());
  45. wstring str66(str6.rbegin(),str6.rend());
  46. wcout<<"CHN\tws6\t:"<<str6<<tab<<str6[1]<<tab<<str66<<endl;
  47. return 0;
  48. }

[C++]C++标准里 string和wstring

上面显示了本地化的作用,是在数字中每三位加一个逗号,其实对时间/文字等都是用影响的。 
     下面的输出说明了,如何正确使用string和wstring的方法。第三个因为使用string来表示汉字,出现了一些错误。最后一行也是错误,导致了输出也受到了影响,没有空格与回车。(最后两个就不要管中英文了,仅仅说明一下中文构造方法是错误的) 
     《掌握标准C++类》在第十二章《语言支持》中专门讲C++的国际化和本地化问题,C++提供了I18N的标准处理,软件开发者可以参考。        C++标准库还是非常博大精深的,功能比较齐全的。继续学习。

来自: http://hi.baidu.com/janvyking999/blog/item/fd5d44df572c3c5c94ee37de.html

[C++]C++标准里 string和wstring的更多相关文章

  1. 基于标准库实现string和wstring的转换

    // convert string to wstring std::wstring to_wstring(const std::string& str, const std::locale&a ...

  2. string、wstring、cstring、 char、 tchar、int、dword转换方法&lpar;转&rpar;

    string.wstring.cstring. char. tchar.int.dword转换方法(转)   最近编程一直头痛这集中类型的转化,明知都可以转却总是记不住,不断的上网查来查去,在这里小结 ...

  3. C&plus;&plus;标准库&lt&semi;string&gt&semi;简单总结

    C++标准库<string>简单总结 在C++中,如果需要对字符串进行处理,那么它自带的标准库<string>无疑是最好的选择,它实现了很多常用的字符处理函数. 要想使用标准C ...

  4. java里String类为何被设计为final

    前些天面试遇到一个非常难的关于String的问题,"String为何被设计为不可变的"?类似的问题也有"String为何被设计为final?"个人认为还是前面一 ...

  5. 【C&plus;&plus; Primer每日刷】之三 标准库 string 类型

    标准库 string 类型 string 类型支持长度可变的字符串.C++ 标准库将负责管理与存储字符相关的内存,以及提供各种实用的操作.标准库string 类型的目的就是满足对字符串的一般应用. 与 ...

  6. STL的string和wstring

    STL有字符串处理类——stirng和wstring,但是用的时候会觉得不是很方便,因为它不能像TCHAR一样根据定义的宏在char类型字符串和wchar_t进行转换,总不能因为程序要Unicode就 ...

  7. C&plus;&plus;标准库string类型

    string类型支持长度可变的字符串,C++标准库将负责管理与存储字符相关的内存,以及提供各种有用的操作.标准库string类型的目的就是满足对字符串的一般应用. 本文地址:http://www.cn ...

  8. 深入理解c&plus;&plus;中char&ast;与wchar&lowbar;t&ast;与string以及wstring之间的相互转换 &lbrack;转&rsqb;

    本篇文章是对c++中的char*与wchar_t*与string以及wstring之间的相互转换进行了详细的分析介绍,需要的朋友参考下. #ifndef USE_H_ #define USE_H_ # ...

  9. 深入理解c&plus;&plus;中char&ast;与wchar&lowbar;t&ast;与string以及wstring之间的相互转换

    本篇文章是对c++中的char*与wchar_t*与string以及wstring之间的相互转换进行了详细的分析介绍,需要的朋友参考下-复制代码 代码如下:    #ifndef USE_H_     ...

随机推荐

  1. tomcat&sol;jsp&sol;servlet版本关系

    Servlet Spec JSP Spec EL Spec WebSocket Spec JASPIC Spec Apache Tomcat version Actual release revisi ...

  2. 莫名其妙MyEclipse

    MyEclipse Enterprise Workbench Version: 2015 Stable 2.0Build id: 13.0.0-20150518 整合SS时,\WEB-INF\clas ...

  3. avalon源码分析&lpar;转&rpar;

    avalon源码分析目录 第一篇 : 关于前端的MVVM架构 第二篇 : 初步接触 第三篇 : 执行流程1 第四篇 :  执行流程2 第五篇 : 整体架构 第六篇 : ViewModel  第七篇 : ...

  4. Shell基础:Shell和Mysql交互

    通过命令行和Mysql交互 [root]#mysql -uroot -p123 -e "show databases"   -e: execute: 执行数据库命令 通过脚本和数据 ...

  5. LINQ to SQL语句之Join和Order By

    Join操作 适用场景:在我们表关系中有一对一关系,一对多关系,多对多关系等.对各个表之间的关系,就用这些实现对多个表的操作. 说明:在Join操作中,分别为Join(Join查询), SelectM ...

  6. c&num;生成word文档

    参考:http://blog.163.com/zhouchunping_99/blog/static/7837998820085114394716/ 生成word文档 生成word文档 view pl ...

  7. Hadoop-2&period;7&period;2集群的搭建——集群学习日记

    前言 因为比赛的限制是使用Hadoop2.7.2,估在此文章下面的也是使用Hadoop2.7.2,具体下载地址为Hadoop2.7.2 开始的准备 目前在我的实验室上有三台Linux主机,因为需要参加 ...

  8. RTKLIB编译及RTCM数据读取样例

    1.RTKLIB简介 RTKLIB是全球导航卫星系统GNSS(global navigation satellite system)的标准&精密定位开源程序包,RTKLIB由日本东京海洋大学( ...

  9. 关于读取excel 和 写excel

        def sync_db(data_list): '''Synchron potential student from excel to PrepareToCrm ''' push_list = ...

  10. 使用katalon自带Spy功能获取&sol;验证控件Selector、XPath

    背景 最近刚接手一个katalon编写的UI自动化项目,页面最近刚改版,已有用例很多查找元素失败.了解到katalon元素定位支持xpath,所以直接使用chrome开发者工具打开目标页面+获取xpa ...