[英]how to store UTF-8 encoding data to sqlite3 using Visual C++
我已经创建了一个编码为UTF-8(默认)的sqlite数据库。
然后,我使用以下语句插入数据:
strcpy(sql,"insert into blog(title) values('呵呵')");
sqlite3_exec(db,sql,0,0,0);
然后我打开SQLite数据库用的工具,叫做sqlite的开发价值title
栏显示ºǺ
在数据编码垃圾代码:UNICODE。 然后我将数据编码更改为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
,但仍然wchar_t
。
我的Visual C ++项目已经定义了UNOCODE
和_UNICODE
,所以我的问题是: 如何使用Visual C ++将UTF-8编码数据存储到sqlite3?
更新(问题已解决)
我使用iconv将GBK编码转换为msandiford启发的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 ('\xE5\x91\xB5\xE5\x91\xB5')");
您可以通过执行以下操作避免将所有源文件转换为UTF-8:
sprintf(sql, "insert into blog (title) values('%s')", AnsiToUtf8("呵呵"));
不幸的是, AnsiToUtf8()
函数将特定于平台。
进一步研究,似乎Visual Studio以Windows区域设置的默认编码保存源文件。 基于此,如果您的开发团队的计算机针对不同的区域设置,则可能存在多种编码。
我认为实现AnsiToUtf8()
函数AnsiToUtf8()
在所有可能的情况下都可以应对AnsiToUtf8()
将非常困难,即使不是不可能,尤其是考虑到要在其上开发代码的计算机的语言环境设置可能与最终运行代码的计算机。
我认为解决此问题的最干净方法是在源文件中统一使用UTF-8编码,假设您要在默认编码和Unicode重叠的区域之外使用字符串文字中的代码点。
另一种方法是使代码国际化,以便源文件不包含扩展字符,并使用诸如GNU gettext之类的东西来处理翻译。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.