3,248
社区成员
发帖
与我相关
我的任务
分享
#ifndef CodingConvert_H
#define CodingConvert_H
//////////////////////////////////////////////////////////////////////////
#include <Windows.h>
//////////////////////////////////////////////////////////////////////////
template <DWORD>
class CodingConvert
{
public:
// lpszBuf - 目标缓冲区
// lBufLen - 目标缓冲区尺寸
// lpszSrc - 原始码
// 返回值为转换后的目标字节数
static LONG GB2312_2_UTF8(PCHAR lpszBuf, LONG lBufLen, LPCSTR lpszSrc, LONG lSrcLen = 0)
{
if (0 == lSrcLen) {
lSrcLen = lstrlenA(lpszSrc);
}
LONG j = 0;
for (LONG i = 0; i < lSrcLen; ) {
if (j >= lBufLen - 1) {
break;
}
if (lpszSrc[i] >= 0) {
lpszBuf[j++] = lpszSrc[i++];
}
else {
USHORT w_c = 0;
Gb2312_2_Unicode(&w_c, lpszSrc + i);
CHAR tmp[4] = "";
Unicode_2_UTF8(tmp, &w_c);
lpszBuf[j+0] = tmp[0];
lpszBuf[j+1] = tmp[1];
lpszBuf[j+2] = tmp[2];
i += 2;
j += 3;
}
}
lpszBuf[j] = '\0';
return j;
}
static LONG UTF8_2_GB2312(PCHAR lpszBuf, LONG lBufLen, LPCSTR lpszSrc, LONG lSrcLen = 0)
{
if (0 == lSrcLen) {
lSrcLen = lstrlenA(lpszSrc);
}
LONG j = 0;
for (LONG i = 0; i < lSrcLen; ) {
if (j >= lBufLen - 1) {
break;
}
if (lpszSrc[i] >= 0) {
lpszBuf[j++] = lpszSrc[i++];
}
else {
USHORT w_c = 0;
UTF8_2_Unicode(&w_c, lpszSrc + i);
CHAR tmp[4] = "";
Unicode_2_GB2312(tmp, w_c);
lpszBuf[j+0] = tmp[0];
lpszBuf[j+1] = tmp[1];
i += 3;
j += 2;
}
}
lpszBuf[j] = '\0';
return j;
}
private:
static __inline void Gb2312_2_Unicode(PUSHORT lpszDst, LPCSTR lpszSrc)
{
::MultiByteToWideChar(CP_ACP, MB_PRECOMPOSED, lpszSrc, 2, (LPWSTR) lpszDst, 1);
}
static __inline void Unicode_2_UTF8(PCHAR lpszDst, PUSHORT lpszSrc)
{
PCHAR pChar = (PCHAR) lpszSrc;
lpszDst[0] = (0xE0 | ((pChar[1] & 0xF0) >> 4));
lpszDst[1] = (0x80 | ((pChar[1] & 0x0F) << 2)) + ((pChar[0] & 0xC0) >> 6);
lpszDst[2] = (0x80 | ( pChar[0] & 0x3F));
}
static __inline void UTF8_2_Unicode(PUSHORT lpszDst, LPCSTR lpszSrc)
{
PCHAR pUChar = (PCHAR) lpszDst;
pUChar[1] = ((lpszSrc[0] & 0x0F) << 4) + ((lpszSrc[1] >> 2) & 0x0F);
pUChar[0] = ((lpszSrc[1] & 0x03) << 6) + (lpszSrc[2] & 0x3F);
}
static __inline void Unicode_2_GB2312(PCHAR lpszDst, USHORT uData)
{
WideCharToMultiByte(CP_ACP, NULL, (LPCWSTR) &uData, 1, lpszDst, sizeof(USHORT), NULL, NULL);
}
};
//////////////////////////////////////////////////////////////////////////
#endif
int OpenDatabase(LPCSTR pszDBFile, sqlite3 *&pSQLite3)
{
CHAR szDBFile[MAX_PATH<<2] = { 0 };
CodingConvert<0>::GB2312_2_UTF8(szDBFile, sizeof(szDBFile), pszDBFile);
return sqlite3_open(szDBFile, &pSQLite3);
}