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

在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(假定GU…
Ajax请求发送的UTF8编码字符串传到后台使用std:string进一步处理,如果包含中文会出现中文乱码的问题: 特找了一下转码的解决方法,直接代码如下:  C++ Code  123456789101112131415161718192021222324252627282930313233343536373839404142434445   // UTF8转std:string // 转换过程:先将utf8转双字节Unicode编码,再通过WideCharToMultiByte将宽字符转换为…
目录 第1章说明    1 1.1 代码    1 1.2 使用    4 第1章说明 VC++中宽窄字符串的相互转换比较麻烦,借助std::string能大大减少代码量. 1.1 代码 函数声明如下: std::string stringA2W(const char* pA,int nA,UINT uCodePage = CP_ACP); std::string stringW2A(const wchar_t*pW,int nW,UINT uCodePage = CP_ACP); std::s…
服务器程序为何要进行内存管理,管中窥豹,让我们从string字符串的操作说起...... new/delete是用于c++中的动态内存管理函数,而malloc/free在c++和c中都可以使用,本质上new/delete底层封装了malloc/free.无论是上面的哪种内存管理方式,都存在以下两个问题: 1.效率问题:频繁的在堆上申请和释放内存必然需要大量时间,降低了程序的运行效率.对于一个需要频繁申请和释放内存的程序由于是服务器程序来说,大量的调用new/malloc申请内存和delete/f…
如果项目本身是使用 Unicode 字符集和utf8编码,std::string的length(),size()甚至是c的strLen取到的都是字节长度了,比如三个汉字,就是9, 以上情况不满足的话,就是用c++的宽字符std::wstring: std::string teststr = "dfd123"; std::wstring wStr(teststr.begin(),teststr.end()); wStr.length(); std::wstring的length()取出的…
MFC中CString 与 std::string 相互转化 CString实际是CStringT, 也就是模板类, 在UNICODE环境下,实际是CStringW, 在多字符集环境下,实际是CStringA std::string就是多字符集的. UNICODE环境下 CStringW-->std::string CString实际是CStringW,要转换成多字符集,需进行转码.使用WideCharToMultiByte 转换成多字符集,然后再构造std::string std::strin…
主要注意的一个问题是:std::string 实际是类似一个 vector<char>的结构. 它里面是可以存放 ascii为0 的字符不算结尾 (否则 unicode方式的编码存放就有问题) 实际长度 用 length()获取 至于string赋值和构造有好几种方式,可以看文档. 举例说明:char c[10]="wer|\t";c[4] = 0;std::string s =c;由于c是char* 长度只能用strlen获取, strlen遇到0 就结束了,所以就丢失数…
1.概念 Scott Meyers在<More Effective C++>中举了个例子,不知你是否还记得?在你还在上学的时候,你的父母要你不要看电视,而去复习功课,于是你把自己关在房间里,做出一副正在复习功课的 样子,其实你在干着别的诸如给班上的某位女生写情书之类的事,而一旦你的父母出来在你房间要检查你是否在复习时,你才真正捡起课本看书.这就是“拖延战 术”,直到你非要做的时候才去做. 当然,这种事情在现实生活中时往往会出事,但其在编程世界中摇身一变,就成为了最有用的技术,正如 C++中的可…
标准C++类std::string的内存共享,值得体会: 详见大牛:https://www.douban.com/group/topic/19621165/ 顾名思义,内存共享,就是两个乃至更多的对象,共同使用一块内存: 1.关于string的内存共享问题: 通常,string类中必有一个私有成员,其是一个char*,用户记录从堆上分配内存的地址,其在构造时分配内存,在析构时释放内存. 因为是从堆上分配内存,所以string类在维护这块内存上是格外小心的,string类在返回这块内存地址时,只返…
最近在给自己的服务器框架加上统计信息,其中一项就是统计创建的对象数,以及当前还存在的对象数,那么自然以对象名字作key.但写着写着,忽然纠结是用std::string还是const char *作key,哪个效率高些.由于这服务器框架业务逻辑全在lua脚本,在C++需要统计的对象没几个,其实用哪个没多大区别.我纠结的是,很久之前就知道这两者效率区别不大,但直到现在我都还没搞清楚为啥,于是写些代码来测试. V1版本的代码如下: #ifndef __MAP_H__ #define __MAP_H__…
标准C++中的string类的用法总结 相信使用过MFC编程的朋友对CString这个类的印象应该非常深刻吧?的确,MFC中的CString类使用起来真的非常的方便好用.但是如果离开了MFC框架,还有没有这样使用起来非常方便的类呢?答案是肯定的.也许有人会说,即使不用MFC框架,也可以想办法使用MFC中的API,具体的操作方法在本文最后给出操作方法.其实,可能很多人很可能会忽略掉标准C++中string类的使用.标准C++中提供的string类得功能也是非常强大的,一般都能满足我们开发项目时使用…
说明:以下涉及的std::string的源代码摘自4.8.2版本.结论:std::string的拷贝复制是基于引用计数的浅拷贝,因此它们指向相同的数据地址. // std::string类定义typedef basic_string<char> string;template<typename _CharT, typename _Traits, typename _Alloc>class basic_string{private: // _Alloc_hider是模板类basic_…
标准C++类std::string的 内存共享和Copy-On-Write技术 陈皓 1. 概念 Scott Meyers在<More Effective C++>中举了个例子,不知你是否还记得?在你还在上学的时候,你的父母要你不要看电视,而去复习功课,于是你把自己关在房间里,做出一副正在复习功课的样子,其实你在干着别的诸如给班上的某位女生写情书之类的事,而一旦你的父母出来在你房间要检查你是否在复习时,你才真正捡起课本看书.这就是“拖延战术”,直到你非要做的时候才去做. 当然,这种事情在现实生…
//宽字符转多字节 std::string W2A(const std::wstring& utf8) { int buffSize = WideCharToMultiByte(CP_ACP, NULL, utf8.c_str(), -1, NULL, NULL, NULL, FALSE); char *gbk = new char[buffSize+1]; memset(gbk, 0, buffSize + 1); WideCharToMultiByte(CP_ACP, NULL, utf8.…
1.             概念 Scott Meyers在<More Effective C++>中举了个例子,不知你是否还记得?在你还在上学的时候,你的父母要你不要看电视,而去复习功课,于是你把自己关在房间里,做出一副正在复习功课的样子,其实你在干着别的诸如给班上的某位女生写情书之类的事,而一旦你的父母出来在你房间要检查你是否在复习时,你才真正捡起课本看书.这就是“拖延战术”,直到你非要做的时候才去做. 当然,这种事情在现实生活中时往往会出事,但其在编程世界中摇身一变,就成为了最有用的技…
I need to convert between UTF-8, UTF-16 and UTF-32 for different API's/modules and since I know have the option to use C++11 am looking at the new string types. It looks like I can use string, u16string and u32string for UTF-8, UTF-16 and UTF-32. I a…
#include <iostream> #include <vector> #include <memory> #include <thread> #include <type_traits> #include <typeinfo> #include <sstream> #include <utility> class StrVec { friend std::ostream &operator<…
#include <QFileDialog>#pragma execution_character_set("utf-8") QString path = QFileDialog::getOpenFileName(this, tr("选择文件"), ".", tr("s3c文件(*.s3c);;全部文件(*.*)")); std::string s = path.toLocal8Bit();…
标准C++类std::string的  内存共享和Copy-On-Write技术 陈皓 1. 概念 Scott Meyers在<More Effective C++>中举了个例子,不知你是否还记得?在你还在上学的时候,你的父母要你不要看电视,而去复习功课,于是你把自己关在房间里,做出一副正在复习功课的样子,其实你在干着别的诸如给班上的某位女生写情书之类的事,而一旦你的父母出来在你房间要检查你是否在复习时,你才真正捡起课本看书.这就是“拖延战术”,直到你非要做的时候才去做. 当然,这种事情在现实…
搞过MFC的人都知道cstring,给我们提供了非常多便利的方法. CString 是一种非常实用的数据类型. 它们非常大程度上简化了MFC中的很多操作,使得MFC在做字符串操作的时候方便了非常多.无论如何,使用CString有非常多特殊的技巧,特别是对于纯C背景下走出来的程序猿来说有点难以学习. 可是非常多情况下,我们还是须要cstring和string的转换. 分两步: 1把cstring转为char数组 2依据char数组,构造自己的string(记得释放内存) std::string C…
字符串在非常多编程语言中已经成为基本数据类型,C语言中我们使用char*来手动申请和维护字符串, 在C++中,能够使用std::string来方便地创建和操作字符串. string是一个模板类.它有basic_string<T>定义: typedef basic_string<char> string; C++的string能够通过成员方法c_str()转换为C语言的char*. 參考文档:cplusplus.com/string 初始化与赋值 string有两个经常使用的构造函数…
807down vote string? wstring? std::string is a basic_string templated on a char, and std::wstring on a wchar_t. char vs. wchar_t char is supposed to hold a character, usually a 1-byte character. wchar_t is supposed to hold a wide character, and then,…
Copy-on-write(以下简称COW)是一种很重要的优化手段.它的核心思想是懒惰处理多个实体的资源请求,在多个实体之间共享某些资源,直到有实体需要对资源进行修改时,才真正为该实体分配私有的资源. COW技术的一个经典应用在于Linux内核在进程fork时对进程地址空间的处理.由于fork产生的子进程需要一份和父进程内容相同但完全独立的地址空间,一种做法是将父进程的地址空间完全复制一份,另一种做法是将父进程地址空间中的页面标记为”共享的“(引用计数+1),使子进程与父进程共享地址空间,但当有…
std::string cstr;QString qstring; //QString str1 = " D:\\参考手册\\BIM\\osg\\build1.OSGB"; //从std::string 到QString qstring = QString(QString::fromLocal8Bit(cstr.c_str())); //从QString 到 std::stringcstr = string((const char *)qstring.toLocal8Bit()); /…
#include <iostream> #include <assert.h> #include <fstream> #include <string> #include <string.h> using namespace std; #ifdef _WIN32 #include <Windows.h> #endif typedef enum FileType { FileType_ANSI = , FileType_UNICODE,…
string 常见的三种实现方式 eager copy COW SSO Fbstring 介绍 Storage strategies Implementation highlights Benchmark 主要类 字符串存储数据结构 small strings : medium strings : large strings : 如何区分字符串类型 category small strings medium strings large strings category() 小端 大端 capac…
之所以抛弃char*的字符串而选用C++标准程序库中的string类,是因为他和前者比较起来,不必 担心内存是否足够.字符串长度等等,而且作为一个类出现,他集成的操作函数足以完成我们大多数情况下(甚至是100%)的需要.我们可以用 = 进行赋值操作,== 进行比较,+ 做串联(是不是很简单?).我们尽可以把它看成是C++的基本数据类型. 标准模板库(STL)提供了一个std::string类,其是std::basic_string的一个特化,它是一个容器类,可把字符串当作普通类型来使用,并支持比…
std::string cstr; QString qstring; //****从std::string 到QString qstring = QString(QString::fromLocal8Bit(cstr.c_str())); //****从QString 到 std::string cstr = string((const char *)qstring.toLocal8Bit());…
刚刚要找个按空格分离std::string的函数, 结果发现了stackoverflow上的这个问题. 也没仔细看, 直接拿来一试, 靠, 不对啊, 怎么分离后多出个空字符串, 也就是 "abc def" 分离后, 得到的是: "abc" "def" "" 这不科学! 老外在耍我么, 再看原来的回答下面已经有人commet了: while (iss) { string subs; iss >> subs; cout…
VS2008, 写一个简单的demo的时候出现了这个: 1>------ Build started: Project: GetExportTable, Configuration: Release Win32 ------1>Compiling...1>main.cpp1>e:\tzcode\getexporttable\getexporttable\GetExportTable.h(61) : warning C4996: 'scanf': This function or v…