在sqlite3中使用中文字符

时间:2011-12-20 10:31:07

标签: c++ sqlite visual-studio-2005 windows-ce

我来自中国,我对sqlite有疑问,但我的英语有点差。我会尽力表达自己。

最近,我使用Visual Studio 2005(VC ++)在sqlite中使用sqlite数据库进行WinCE开发。在我的表中,一个字段包含一些汉字。当我展示这些时,我得不到我想要的东西,因为它们都是奇怪的角色。

我使用我想要的函数'返回列值,但我不能。

const unsigned char *sqlite3_column_text(sqlite3_stmt*, int iCol);
// or
const void *sqlite3_column_text16(sqlite3_stmt*, int iCol);

他们说sqlite3中的编码是utf8,所以你需要将它转换为unicode。我尝试使用互联网上的功能来完成这项工作,如下所示:

wstring UTF8ToUnicode(const string& strin)
{
    wstring strOut;
    int dwNum = MultiByteToWideChar(CP_UTF8,0,strin.c_str(),-1,0,0)
    wchar_t* pBuffer = new wchar_t[dwNum];
    if (!pBuffer){return strOut;}
    memset(pBuffer,0,dwNum*sizeof(wchar_t));
    if (MultiByteToWideChar(CP_UTF8,0,strin.c_str(),-1,pBuffer,dwNum)>=0)
    {
        strOut= pBuffer;
    }
    delete[] pBuffer;
    return strOut;
}

2 个答案:

答案 0 :(得分:4)

“他们说sqlite3中的编码是utf8”

谁说这是错的。使用的编码取决于数据库的打开方式。

“如果调用sqlite3_open()或sqlite3_open_v2(),则数据库的默认编码为UTF-8;如果使用sqlite3_open16(),则为本机字节顺序的UTF-16。”

http://sqlite.org/c3ref/open.html

然而,这几乎不重要。但是,数据存储sqlite3_column_text()将始终返回UTF8,sqlite3_column_text16()将始终以本机字节顺序返回UTF16。您不需要编写yopur自己的转换代码。唯一的区别是效率 - 在没有转换的情况下提取存储数据的速度稍快一些。

答案 1 :(得分:1)

调用const sqlite3_column_text16后,您是否打电话给sqlite3_column_bytes?如果你这样做,那会将字符更改为字节。这是我的代码,以使中文运作良好。

void sqlite3_column_string16(sqlite3_stmt* stmt, int col, std::wstring* str) {
    int len = sqlite3_column_bytes(stmt, col);
    const wchar_t* c_str = static_cast<const wchar_t*>(sqlite3_column_text16(stmt, col));
    if (c_str && len > 0)
        str->assign(c_str, len);
    else
        *str = _T("");
}