最近想从HTML中提取需要的信息,找的那些HTML解释器没有一个好用,就直接用正则表达式来提取了。因为网页中含有中文,所以我都是转换成宽字符再用regex库或者xpressive库的。但是总是出现漏匹配的情况,后来检查了一下我的string转wstring函数,改写了一下就可以了。原来的string转wstring是网上copy的,如下
/***********************************************************************/ /*string转wstring*/ /***********************************************************************/ #include <string> #include <locale.h> using namespace std; wstring str2wstr(const string &str) { setlocale(LC_ALL, "chs"); const char* _Source = str.c_str(); size_t _Dsize = str.size() + 1; wchar_t *_Dest = new wchar_t[_Dsize]; wmemset(_Dest, 0, _Dsize); mbstowcs(_Dest,_Source,_Dsize); wstring result = _Dest; delete []_Dest; setlocale(LC_ALL, "C"); return result; } /***********************************************************************/ /*wstring转string*/ /***********************************************************************/ #include <string> #include <locale.h> using namespace std; string wstr2str(const wstring &wstr) { string curLocale = setlocale(LC_ALL, NULL); // curLocale = "C"; setlocale(LC_ALL, "chs"); const wchar_t* _Source = wstr.c_str(); size_t _Dsize = 2 * wstr.size() + 1; char *_Dest = new char[_Dsize]; memset(_Dest,0,_Dsize); wcstombs(_Dest,_Source,_Dsize); string result = _Dest; delete []_Dest; setlocale(LC_ALL, curLocale.c_str()); return result; }
#include <string> #include <locale.h> #include <Windows.h> using namespace std; wstring str2wstr(const string &str) { wstring result; //获取缓冲区大小,并申请空间,缓冲区大小按字符计算 int len = MultiByteToWideChar(CP_ACP, 0, str.c_str(), str.size(), NULL, 0); TCHAR* buffer = new TCHAR[len + 1]; //多字节编码转换成宽字节编码 MultiByteToWideChar(CP_ACP, 0, str.c_str(), str.size(), buffer, len); buffer[len] = '\0'; //添加字符串结尾 //删除缓冲区并返回值 result.append(buffer); delete[] buffer; return result; } string wstr2str(const wstring &wstr) { string result; //获取缓冲区大小,并申请空间,缓冲区大小事按字节计算的 int len = WideCharToMultiByte(CP_ACP, 0, wstr.c_str(), wstr.size(), NULL, 0, NULL, NULL); char* buffer = new char[len + 1]; //宽字节编码转换成多字节编码 WideCharToMultiByte(CP_ACP, 0, wstr.c_str(), wstr.size(), buffer, len, NULL, NULL); buffer[len] = '\0'; //删除缓冲区并返回值 result.append(buffer); delete[] buffer; return result; }