在VC++的世界里,MS比较鼓励使用_UNICODE,std::wstring。而在Web, XML则提倡用UTF8。当在C++的程序里要保存/读取XML数据,就存在wstring与string之间的转换。C++11里提供方便的转换工具(参照:std::wstring_convert处理UTF8 )



有人说,MS引入_UNICODE就是个错误,STL引入wstring也是个错误;而鼓励使用UTF8 string做为程序内部string存储格式。在与GUI交互的时候,转换为wstring(假定GUI使用的是_UNICODE)。这样做至少有一个好处:相对的可以减少程序运行时占用内存的大小。当然现在内存资源也不是个什么大问题,我更关心的是保存/读取XML数据的效率。



VC++默认构造std::string的时候是ANSI格式,如

std::string nstr = "123,我是谁?我爱十八大!";   

为了构造个UTF8的string,总不能这样写吧

inline std::string ToUTF8(const wchar_t* wideStr)

{

   std::wstring_convert<std::codecvt_utf8<wchar_t>> conv;

   return conv.to_bytes(wideStr);

}



std::string nstr = ToUTF8(L"123,我是谁?我爱十八大!");

这样写能Work,但总感觉有问题。



VC++ 2008 SP1提供了个编译选项,可以默认就构造出UTF8的string,不需要上述转换。

#pragma execution_character_set("utf-8") 

这样string就是utf8。

那wstring的编码格式会变吗?若变,会变成啥呢?

std::wstring str = L"123,我是谁?";

另外C++11定义了u8,类似L

  std::string nstr = u8"123,我是谁?";

但VS2010SP1并不支持。

注:

以上说的都是VC++的事儿。而Clang,据说默认就是utf8(有待验证)。

构造UTF8的std::string的更多相关文章

  1. UTF8与std:string互转

    Ajax请求发送的UTF8编码字符串传到后台使用std:string进一步处理,如果包含中文会出现中文乱码的问题: 特找了一下转码的解决方法,直接代码如下:  C++ Code  1234567891 ...

  2. VC++ 中使用 std::string 转换字符串编码

    目录 第1章说明    1 1.1 代码    1 1.2 使用    4 第1章说明 VC++中宽窄字符串的相互转换比较麻烦,借助std::string能大大减少代码量. 1.1 代码 函数声明如下 ...

  3. 【超值分享】为何写服务器程序需要自己管理内存,从改造std::string字符串操作说起。。。

    服务器程序为何要进行内存管理,管中窥豹,让我们从string字符串的操作说起...... new/delete是用于c++中的动态内存管理函数,而malloc/free在c++和c中都可以使用,本质上 ...

  4. 计算std:string的字节长度

    如果项目本身是使用 Unicode 字符集和utf8编码,std::string的length(),size()甚至是c的strLen取到的都是字节长度了,比如三个汉字,就是9, 以上情况不满足的话, ...

  5. CString 与 std::string 相互转化

    MFC中CString 与 std::string 相互转化 CString实际是CStringT, 也就是模板类, 在UNICODE环境下,实际是CStringW, 在多字符集环境下,实际是CStr ...

  6. 关于std::string

    主要注意的一个问题是:std::string 实际是类似一个 vector<char>的结构. 它里面是可以存放 ascii为0 的字符不算结尾 (否则 unicode方式的编码存放就有问 ...

  7. (转)C++——std::string类的引用计数

    1.概念 Scott Meyers在<More Effective C++>中举了个例子,不知你是否还记得?在你还在上学的时候,你的父母要你不要看电视,而去复习功课,于是你把自己关在房间里 ...

  8. 标准C++类std::string的内存共享和Copy-On-Write(写时拷贝)

    标准C++类std::string的内存共享,值得体会: 详见大牛:https://www.douban.com/group/topic/19621165/ 顾名思义,内存共享,就是两个乃至更多的对象 ...

  9. C++ std::unordered_map使用std::string和char *作key对比

    最近在给自己的服务器框架加上统计信息,其中一项就是统计创建的对象数,以及当前还存在的对象数,那么自然以对象名字作key.但写着写着,忽然纠结是用std::string还是const char *作ke ...

随机推荐

  1. 洛谷P5664 Emiya 家今天的饭 题解 动态规划

    首先来看一道题题: 安娜写宋词 题目背景 洛谷P5664 Emiya 家今天的饭[民间数据] 的简化版本. 题目描述 安娜准备去参加宋词大赛,她一共掌握 \(n\) 个 词牌名 ,并且她的宋词总共有 ...

  2. zabbix 4.04 安装文档 - 基于CentOS 7.6

    1    安装前准备: 1.1   安装JDK 卸载openjdk # rpm -qa | grep java # yum remove java-1.8.0-openjdk # yum remove ...

  3. iFit—Smart Cardio Equipment 简介与下载

    iFit—Smart Cardio Equipment 无法在谷歌商店中下载,经过技术提取app只可以直接通过下载app安装简单方便 实测机型:华为荣耀畅玩2平板, 小米6X,360N5S均测试无BU ...

  4. 关于AWD线下攻防的经验

    备份:     1.备份源码,使用图像化工具连接ssh后,我喜欢用winscp,         找到根目录后,直接右键后台下载就行.           找根目录这里,有时候比赛不给根目录位置,上次 ...

  5. Quartz.NET总结(八)如何根据自己需要配置Topshelf 服务

    前面讲了如何使用Topshelf 快速开发windows服务, 不清楚的可以看之前的这篇文章:https://www.cnblogs.com/zhangweizhong/category/771057 ...

  6. 《工具》centos 7.x 下安装 JDK,超详细总结一看就会

    第一步 检查 JDK 查看JDK版本,在命令行输入:java -version [root@test ~]# java -version bash: java: command not found 如 ...

  7. 低秩稀疏矩阵恢复|ADM(IALM)算法

    一曲新词酒一杯,去年天气旧亭台.夕阳西下几时回? 无可奈何花落去,似曾相识燕归来.小园香径独徘徊. ---<浣溪沙·一曲新词酒一杯>--晏殊 更多精彩内容请关注微信公众号 "优化 ...

  8. Spring Boot2 系列教程 (二) | 第一个 SpringBoot 工程详解

    微信公众号:一个优秀的废人 如有问题或建议,请后台留言,我会尽力解决你的问题. 前言 哎呦喂,按照以往的惯例今天周六我的安排应该是待在家学学猫叫啥的.但是今年这种日子就可能一去不复返了,没法办法啊.前 ...

  9. 双射 - hash去重

    题目描述Two undirected simple graphs and where are isomorphic when there exists a bijection on V satisfy ...

  10. vue需要知道哪些才能算作入门以及熟练

    前两天接到一个面试官问我vue什么程度才算作可以用于开发,以前从没遇到过类似问题.只能大致说了一些,事后觉得也应该总结一下,前端vue这么火热那究竟什么才算做入门什么才算做熟练,只是我个人观点,不代表 ...