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 "\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; wstring str5(str1.begin(),str1.end());//只有char类型的string时才可以如此构造
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;
}
C++的中英文字符串表示(string,wstring)的更多相关文章
- C++的中英文字符串表示(string,wstring),使用wcout.imbue(std::locale("chs"));本地化解析编码
在C++中字符串类的string的模板原型是basic_string template <class _Elem, class traits = char_traits<_Elem> ...
- android上让我放弃使用wstring来操作中英文字符串 转
android上让我放弃使用wstring来操作中英文字符串 2013-08-07 16:37:24| 分类: cocos2d|举报|字号 订阅 项目需要,需要对中英文字符串进行遍历修改等, ...
- php截取中文字符串,英文字符串,中英文字符串长度的方法
今天学习了php函数截取中文字符串,英文字符串,中英文字符串的函数使用方法.对中英文截取方法不理解,此处先做记录. PHP自带的函数如strlen().mb_strlen()都是通过计算字符串所占字节 ...
- [技术] OIer的C++标准库 : 字符串库<string>
引入 上次我在博客里介绍了OI中可能用到的STL中的功能, 今天我们接着来发掘C++标准库中能为OI所用的部分. 众所周知, OI中经常用到字符串相关的处理, 这时善用字符串库可以使一些操作更加简洁易 ...
- JavaScript截取中英文字符串
有时在显示某段文字的时候,可能会太长,影响我们页面的显示效果.如果仅是英文,那么我们可以用String.substring(start, end)函数就已经够用了.但是通常我们都会遇到既有英文,又有汉 ...
- js截取中英文字符串、标点符号无乱码示例解读
<script> function subString(str, len, hasDot) { var newLength = 0; var newStr = ""; ...
- ASP.NET MVC 5 - 创建连接字符串(Connection String)并使用SQL Server LocalDB
您创建的MovieDBContext类负责处理连接到数据库,并将Movie对象映射到数据库记录的任务中.你可能会问一个问题,如何指定它将连接到数据库? 实际上,确实没有指定要使用的数据库,Entity ...
- 窥探Swift之字符串(String)
之前总结过Objective-C中的字符串<Objective-C精选字符串处理方法>,学习一门新语言怎么能少的了字符串呢.Swift中的String和Objective-C语言中NSSt ...
- 数据结构和算法 – 4.字符串、 String 类和 StringBuilder 类
4.1.String类的应用 class String类应用 { static void Main(string[] args) { string astring = "Now is The ...
随机推荐
- mysql中判断记录是否存在方法比较【转】
把数据写入到数据库的时,常常会碰到先要检测要插入的记录是否存在,然后决定是否要写入. 我这里总结了判断记录是否存在的常用方法: sql语句:select count(*) from tablename ...
- Windows store app[Part 2]:全新的File System与Uri不匹配的问题
在Win 8 App的安全沙箱内,除了使用文件选取器FileOpenPicker外,没有其他办法调用某个盘符的数据. 全新的Storage命名空间,借鉴了IOS与Android的设计. 下面引用一个图 ...
- 理解ASP.NET MVC引擎处理模型字符串的默认行为,涉及Html.Raw()和HttpUtility.HtmlDecode()
MVC引擎默认会将Model属性值中包含的html字符串做encode,所以如属性中包含类似 <br> 这样的标记,MVC引擎会将它们转换成html实体码 %3Cbr%3E 所以1:在编辑 ...
- 使用Razor视图引擎来生成邮件内容
邮件的内容其实是就HTML,传统的做法都是通过在程序中拼接字符串来生成邮件的内容,生成困难,维护也困难.Razor是MVC里面使用的视图引擎,用来生成HTML非常方便,ZKEACMS中就是使用了Raz ...
- consul ACL2
简介 Consul有多个组件,但是整体上,consul通常作为服务发现工具来使用. Consul主要由以下特点: 服务发现 健康检查 KV存储 多数据中心 Consul一般与zookeeper,ser ...
- 开发.NET Core NuGet包并实现CI/CD
实际开发中我们需要对一些公共类库进行开发,并基于Jenkins进行CI/CD(CI:持续集成,CD:持续部署),其他项目通过NuGet引用.上文讲述了如何搭建本地NuGet服务器并发布NuGet包,这 ...
- Major OSL changes to catch up
flat_map optimization for runtime specialization: https://github.com/imageworks/OpenShadingLanguage/ ...
- webstorm中新建vue工程
1.在https://nodejs.org/en/下载安装nodejs 2.vue-cli 搭建框架 首先从官方网站安装 node.js,会一并安装 npm工具.注意 npm一定要3.10以上,以免很 ...
- Postman使用手册3——环境变量
一.环境变量 当使用API的时候,你可能经常需要使用不同的设置.环境设置可以让你使用变量自定义request.这个方法可以让你轻松的在不同的设置之间改变而不用改变你的request.你不需要担心要记住 ...
- Vs.net 常用命令行
下面的是从 devenv /? 看到的 用法: devenv [解决方案文件 | 项目文件 | 任意文件.扩展名] [开关] devenv 的第一个参数通常是一个解决方案文件或项目文件. 如果 ...