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

how to store UTF-8 encoding data to sqlite3 using Visual C++

本文关键字:存储 数据 sqlite3 编码 Visual 何使用 C++ UTF-8      更新时间:2023-10-16

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

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

strcpy(sql,"insert into blog(title) values('呵呵')");
sqlite3_exec(db,sql,0,0,0);

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

据我所知,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,但仍然无法解决。

我的Visual C++项目已经定义了UNOCODE&_UNICODE,所以我的问题是:如何使用Visual C++将UTF-8编码的数据存储到sqlite3


更新(问题已解决)

受msandiford的启发,我使用iconvGBK编码转换为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);

将评论收集到答案表单中:

从问题注释来看,显然源文件不是用UTF-8编码的。转换为UTF-8或直接使用UTF-8编码似乎是可行的。

直接使用UTF-8编码:

    strcpy(sql,"insert into blog (title) values ('xE5x91xB5xE5x91xB5')");

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

    sprintf(sql, "insert into blog (title) values('%s')", AnsiToUtf8("呵呵"));

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


进一步研究,Visual Studio似乎以Windows区域设置的默认编码保存源文件。基于此,如果您的开发团队的计算机设置为不同的区域设置,则可能会有各种编码。

我认为,要实现一个能够处理所有可能情况的AnsiToUtf8()函数,即使不是不可能,也是非常困难的,特别是考虑到开发代码的计算机的区域设置可能与最终运行代码的计算机不同。

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

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