如何使用Visual C++将UTF-8编码的数据存储到sqlite3中
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 Developer的工具打开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
,但仍然无法解决。
我的Visual C++项目已经定义了UNOCODE
&_UNICODE
,所以我的问题是:如何使用Visual C++将UTF-8编码的数据存储到sqlite3
更新(问题已解决)
受msandiford的启发,我使用iconv将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);
将评论收集到答案表单中:
从问题注释来看,显然源文件不是用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或类似的东西来处理翻译。
- 使用 char* 存储数据和产生的错误
- 我可以存储数据的地方/C++,Linux,QtCreator
- 如何在共享库的整个生命周期内存储数据
- 在字符串数组中动态创建和存储数据
- 用指向文件的指针存储数据结构
- 如何存储数据/我们如何获取存储在 unordered_map c++11 中存储桶中的数据
- 存储数据的对象和存储指向数据的智能指针的对象
- C++读取文本文件并存储数据
- Cocos2dx: 无法存储数据?
- 如何在每次循环迭代期间生成向量,存储数据,然后删除该向量?
- 尝试从每个预期数据之间有多个空间的文件中读取和存储数据
- 存储数据列表并自动分配给结构的最佳方法是什么
- QT MAC应用程序存储数据路径
- 动态分配存储数据在堆中的随机位置中
- 鸟类调查中的项目在代码中遇到问题.如何像数据库系统一样存储数据
- 可以在C 中永久存储数据中的数据
- 用于存储数据的结构和外部二进制文件
- 使用 char 数组存储数据
- 在结构中读取和存储数据
- 尝试在结构中存储数据时出现堆分配错误