C++解析UNICODE字符表示很蛋疼,现在记录下下午的收获,以备以后调用。
基本思路:按行读取unicode文件,存为wstring, 再将其转为string,然后通过stringstream来处理,获取想要的数据
基本函数:
#include <clocale>
#include <cassert>
#include <string>
#include <fstream>
//string转wstring
std::wstring string2wstring(const std::string& str)
{
unsigned len = str.size() * 2; // 预留字节数
setlocale(LC_CTYPE, ""); //必须调用此函数
wchar_t *p = new wchar_t[len]; // 申请一段内存存放转换后的字符串
mbstowcs(p,str.c_str(),len); // 转换
std::wstring str1(p);
delete[] p; // 释放申请的内存
return str1;
}
// wstring转string
std::string wstring2string(const std::wstring& str)
{
unsigned len = str.size() * 4;
setlocale(LC_CTYPE, "");
char *p = new char[len];
wcstombs(p,str.c_str(),len);
std::string str1(p);
delete[] p;
return str1;
}
//获取unicode文件一行
std::wstring wgetline(std::ifstream& fin)
{
assert( fin.good() );
std::wstring wstr;
wchar_t wc;
while ( !fin.eof() )
{
fin.read( (char*)&wc, sizeof(wchar_t) ); //每次读取2个字符
if ( wc == 0x000D ) //如果是回车
{
fin.seekg( 2, std::ios::cur ); //丢弃换行字符
break;
}
else
{
wstr.append( 1, wc ); //加入wstr
}
}
return wstr;
}
以后再次处理,果断贴代码,怒了!