我来自中国,我对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;
}
答案 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("");
}