分享

Mongodb中C客户端与Java客户端的交互

 myjessie123 2015-09-10

编译环境:Win7 VS2010

Mongodb版本:2.4.6

C++ Driver版本:2.4.6

Java Driver版本:2.4

在C++客户端写入Mongodb记录后,Java作为展示端,读取mongodb中的数据。当记录为英文时,没有任何问题;当记录出现中文时,C++读取正常,Java端读取为乱码。

因为mongodb中的编码时utf-8,所以尝试在Java端,将utf-8转换为GBK,结果没有成功。后来尝试在C++写入时,将unicode转换为utf-8,再写入mongodb,则Java读取正常。C++端读取的时候,需要将utf-8转换回unicode即可。

下面是一个demo:

#include 'dbclient.h' // the mongo c++ driver#include <fstream>#include <iostream>#include <clocale>using namespace std;using namespace mongo;using namespace bson;using std::wcout;void UnicodeToUTF8(char *utf, wchar_t* wszString){	//预转换,得到所需空间的大小	int u8Len = ::WideCharToMultiByte(CP_UTF8, NULL, wszString, wcslen(wszString), NULL, 0, NULL, NULL);	//同上,分配空间要给'\0'留个空间	//UTF8虽然是Unicode的压缩形式,但也是多字节字符串,所以可以以char的形式保存	//转换	//unicode版对应的strlen是wcslen	::WideCharToMultiByte(CP_UTF8, NULL, wszString, wcslen(wszString), utf, u8Len, NULL, NULL);	//最后加上'\0'	utf[u8Len] = '\0';}void UTF8ToUnicode(wchar_t *unicode, char *utf){	//utf8-unicode	//预转换,得到所需空间的大小	int wcsLen = ::MultiByteToWideChar(CP_UTF8, NULL, utf, strlen(utf), NULL, 0);	//分配空间要给'\0'留个空间,MultiByteToWideChar不会给'\0'空间	//转换	::MultiByteToWideChar(CP_UTF8, NULL, utf, strlen(utf), unicode, wcsLen);	//最后加上'\0'	unicode[wcsLen] = '\0';	//输出测试一下 	locale::global(locale('')); //init 放在main函数第一行最好	wcout.imbue(locale(''));	wcout << unicode;	wcout.clear();		wcout<<endl; //注意千万不要写成wcout << wszString << endl;否则中文无法输出}int main() {	cout << 'connecting to localhost...' << endl;	DBClientConnection c;	c.connect('localhost'); //100.121.25.23:27400	cout << 'connected ok' << endl;	//存入文件	string fileName =  'C:\\WCSFiles\\1.jpg'; //'D:\\DownLoads\\P6.rar';//	std::ifstream file;	file.open(fileName, std::ios::binary);	file.seekg(0,std::ios::end);		//设置文件指针位置到文件尾	int len = file.tellg();		//读取文件指针的位置,获取文件长度	file.seekg(0, std::ios::beg);	char *file_buf = new char[len+1];	memset(file_buf, 0, len+1);	file.read(file_buf, len);	file.close();	GridFS fs (c, 'test');	BSONObj fileObj = fs.storeFile(file_buf, len, fileName); //保存文件	//关联文件属性	char well_name[128] = {0};	wchar_t* wszString = L'ss测试井111';	UnicodeToUTF8(well_name, wszString);//unicode to UTF8	//	string well_name = '天津-123455';	mongo::BSONObjBuilder builder;	builder.append( 'well_name' , well_name);	builder.append( 'wellborn_name' , 'test_022' );	builder.append( 'num' , 30 );	builder.append('file', fileObj);	c.insert( 'test.well001' , builder.obj() );			//读取井名	auto_ptr<DBClientCursor> cursor = c.query('test.well001', BSONObj());	while( cursor->more() ) 	{		//utf8-unicode		char szU8[1024] = {0};		strcpy_s(szU8, (cursor->next())['well_name'].str().c_str());		wchar_t wszString[2048];		UTF8ToUnicode(wszString, szU8);	}		return 0;}


    本站是提供个人知识管理的网络存储空间,所有内容均由用户发布,不代表本站观点。请注意甄别内容中的联系方式、诱导购买等信息,谨防诈骗。如发现有害或侵权内容,请点击一键举报。
    转藏 分享 献花(0

    0条评论

    发表

    请遵守用户 评论公约

    类似文章 更多