2011-12-20 256 views
1

我来自中国,我有一个关于sqlite的问题,但是我的英语有点差。我会尽力表达自己。在sqlite3中使用汉字

最近,我在使用Visual Studio 2005(VC++)进行WinCE开发的sqlite中使用了一个sqlite数据库。在我的表格中,一个字段包含一些中文字符。当我展示这些时,我没有得到我想要的,因为他们都是陌生人物。

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

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

请标记语言(C++)。 – 2011-12-20 10:34:12

+0

您可能想要解释_“我使用函数的'返回列值,但我不能。”_...真的不知道在那里创建了什么点。 – jro 2011-12-20 10:42:03

回答

4

“他们说在sqlite3的的编码是UTF8”

凡说这是错误的。使用的编码取决于数据库如何打开。

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

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

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

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(""); 
}