首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何使用Visual sqlite3将UTF-8编码数据存储到C++

如何使用Visual sqlite3将UTF-8编码数据存储到C++
EN

Stack Overflow用户
提问于 2012-01-06 05:34:31
回答 1查看 4.3K关注 0票数 0

我已经创建了一个使用编码UTF-8(默认)的sqlite数据库。

然后使用以下语句插入数据:

代码语言:javascript
复制
strcpy(sql,"insert into blog(title) values('呵呵')");
sqlite3_exec(db,sql,0,0,0);

然后用名为sqlite Developer的工具打开SQLite数据库,title字段的值显示了Data ºǺ�下的ºǺ�垃圾代码。然后我将数据编码改为ANSItitle的值显示正确。

据我所知,sqlite3_exec原型是:

代码语言:javascript
复制
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启发的。非常感谢孟德福德。

代码语言:javascript
复制
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);
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2012-01-06 06:47:34

收集意见以答复形式:

从问题评论来看,源文件显然不是用UTF-8编码的.转换为UTF-8或直接使用UTF-8编码似乎有效。

直接使用UTF-8编码:

代码语言:javascript
复制
    strcpy(sql,"insert into blog (title) values ('\xE5\x91\xB5\xE5\x91\xB5')");

您可以通过这样的操作来避免将所有源文件转换为UTF-8:

代码语言:javascript
复制
    sprintf(sql, "insert into blog (title) values('%s')", AnsiToUtf8("呵呵"));

不幸的是,AnsiToUtf8()函数将是非常特定于平台的。

再看一看,Visual似乎会以默认编码方式保存Windows语言环境设置的源文件。基于此,如果您的开发团队的计算机是针对不同的地区设置的,则可能会出现各种各样的编码。

我认为如果不是不可能的话,很难实现一个AnsiToUtf8()函数来处理所有可能的情况,特别是考虑到开发代码的计算机的区域设置可能与最终运行代码的计算机不一样。

我认为解决这一问题的最干净的方法是在源文件中统一使用UTF-8编码,假设您希望在默认编码和Unicode重叠的区域之外使用字符串文本中的代码点。

另一种方法是将代码国际化,使源文件不包含扩展字符,并使用类似于GNU gettext或类似的内容来处理翻译。

票数 4
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/8753812

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档