我已经创建了一个使用编码UTF-8(默认)的sqlite数据库。
然后使用以下语句插入数据:
strcpy(sql,"insert into blog(title) values('呵呵')");
sqlite3_exec(db,sql,0,0,0);然后用名为sqlite Developer的工具打开SQLite数据库,title字段的值显示了Data ºǺ�下的ºǺ�垃圾代码。然后我将数据编码改为ANSI,title的值显示正确。
据我所知,sqlite3_exec原型是:
int sqlite3_exec(
sqlite3*, /* An open database */
const char *sql, /* SQL to be evaluated */
int (*callback)(void*,int,char**,char**), /* Callback function */
void *, /* 1st argument to callback */
char **errmsg /* Error msg written here */
);我仍然试图将wchar_t类型传递给sql,但仍然无法解决。
我的VisualC++项目已经定义了UNOCODE & _UNICODE,所以我的问题是:如何使用Visual C++?将UTF-8编码数据存储到sqlite3。
更新(问题解决)
我使用图标将GBK编码转换为UTF-8,这是受msandiford启发的。非常感谢孟德福德。
char* pOut;
char* pIn;
size_t inLen,outLen=2000;
strcpy(sql,"insert into blog(title) values('呵呵')");
string strSQL = sql;
char* sql2 = (char*)malloc(2000);
memset(sql2,0,2000);
pOut = &sql2[0];
inLen = strlen(strSQL.c_str());
pIn = const_cast<char*>(strSQL.c_str());
iconv_t g2u8 = iconv_open("UTF-8","GBK");
iconv(g2u8,(const char**)&pIn,&inLen,&pOut,&outLen);
sqlite3_exec(db,sql2,0,0,0);发布于 2012-01-06 06:47:34
收集意见以答复形式:
从问题评论来看,源文件显然不是用UTF-8编码的.转换为UTF-8或直接使用UTF-8编码似乎有效。
直接使用UTF-8编码:
strcpy(sql,"insert into blog (title) values ('\xE5\x91\xB5\xE5\x91\xB5')");您可以通过这样的操作来避免将所有源文件转换为UTF-8:
sprintf(sql, "insert into blog (title) values('%s')", AnsiToUtf8("呵呵"));不幸的是,AnsiToUtf8()函数将是非常特定于平台的。
再看一看,Visual似乎会以默认编码方式保存Windows语言环境设置的源文件。基于此,如果您的开发团队的计算机是针对不同的地区设置的,则可能会出现各种各样的编码。
我认为如果不是不可能的话,很难实现一个AnsiToUtf8()函数来处理所有可能的情况,特别是考虑到开发代码的计算机的区域设置可能与最终运行代码的计算机不一样。
我认为解决这一问题的最干净的方法是在源文件中统一使用UTF-8编码,假设您希望在默认编码和Unicode重叠的区域之外使用字符串文本中的代码点。
另一种方法是将代码国际化,使源文件不包含扩展字符,并使用类似于GNU gettext或类似的内容来处理翻译。
https://stackoverflow.com/questions/8753812
复制相似问题