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

编译环境: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 
#include 
#include 

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< 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;
}


你可能感兴趣的:(NoSql,C/C++)