SQLite关于转码

   SQLite在保存中文的时候,他会默认就行UTF8到Unicode的转换,而从里面取出数据的时候它又会我们表里字符默认转成UTF8.........难道它是考虑到只跟网页的交互了吗?完全没有顾及到应用程序在用他的时候的感受,所有,我们在插入数据(带中文),跟取出数据的时候,就得对字串进行一番转码了。

首先看看存储的时候,把Unicode转为UTF8,然后交给SQLite,它把它认为是从网页上来的数据默认进行UTF8到Unicode的转换,这时,我们在表里看到的数据才是我们所熟悉的Unicode, 废话不说了,直接上例子。

// 获取到的中文数据的转码
void UTF8Transcoding(string &str)
{
	int len  = WideCharToMultiByte(CP_UTF8,0,CA2W((char*)str.data()),-1,NULL,0,NULL,NULL);

	char *strNew = new char[len+1];

	WideCharToMultiByte(CP_UTF8,0,CA2W((char*)str.data()),-1,strNew,len,NULL,NULL);

	strNew[len] = '\0';
	str.clear();

	str = strNew;
	delete[] strNew;

	return ;
}

然后是我们取到数据后,又是SQLlite这货把咱么认为成网页而默认把我们的数据转成UTF8传给我们了,所以还得进行 UTF8到Unicode的转换,还是看例子:

// 获取到的中文数据的转码
void Change(string &str)
{
	int len  = MultiByteToWideChar(CP_UTF8,0,str.data(),-1,NULL,0);

	WCHAR *strNew = new WCHAR[len+1];

	MultiByteToWideChar(CP_UTF8,0,str.data(),-1,strNew,len);

	str.clear();

	str = CW2A(strNew);
	delete[] strNew;

	return ;
}

CW2A是将宽字符转换为同样意思的窄字符,需要包头文件 #include "atlbase.h"


将中文转换为有\u格式的Unicode

void CDingDingDlg::UnicodeProcess(string &str)
{
	int iSize;
	string strRet ;
	string strTemp;
	wchar_t *xet = new wchar_t[2];

	char stchr[7] = {0};

	for (int i = 0; i < str.length(); i++)
	{
		if ( str[i] >= 0 && str[i] <= 127 )
		{
			strRet += str[i];
		}
		else
		{
			*(xet+1) = 0;
			 strTemp = str[i]; strTemp += str[i+1];
			iSize = MultiByteToWideChar(CP_ACP, 0, strTemp.data() , -1, NULL, 0); 
			MultiByteToWideChar(CP_ACP, 0, strTemp.data() , -1, xet , iSize);
			sprintf(stchr,"\\u%x",*xet);
			strRet += stchr;
			i++;
		}
	}

	::delete[] xet; xet = NULL;
	str = strRet;
	return ;
	//wsprintf(pwstr);
}





  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值