ClientDataset读取sqlite3数据库,中文乱码问题

xianyz2012 2012-10-16 11:16:06
如题:用ClientDataSet关联上sqlite3的一张表,表中有中文字段,但是当用DBGrid显示出来时,中文乱码,该怎么解决
...全文
710 23 打赏 收藏 转发到动态 举报
写回复
用AI写文章
23 条回复
切换为时间正序
请发表友善的回复…
发表回复
xianyz2012 2012-10-18
  • 打赏
  • 举报
回复
[Quote=引用 22 楼 的回复:]

引用 21 楼 的回复:
我分析里下:是不是如果不转码的话,sqlite中存储的编码是D1 CF,当读取时也是读取这个编码,但是 不是用ANS码,而是用UTF8编码,可D1 CF用UTF8来解释,结果就是不可知的,从而造成乱码,是不是这个原因啊?

是的,就是这个样子。
[/Quote]
嗯 谢谢妖哥 收获很大...嘿嘿
ccrun.com 2012-10-18
  • 打赏
  • 举报
回复
[Quote=引用 21 楼 的回复:]
我分析里下:是不是如果不转码的话,sqlite中存储的编码是D1 CF,当读取时也是读取这个编码,但是 不是用ANS码,而是用UTF8编码,可D1 CF用UTF8来解释,结果就是不可知的,从而造成乱码,是不是这个原因啊?[/Quote]

是的,就是这个样子。
xianyz2012 2012-10-18
  • 打赏
  • 举报
回复
[Quote=引用 18 楼 的回复:]

我来了,楼主还在么?

经研究发现,问题的主要原因是你写入数据的时候,字符的编码是ANSI的,而在DBGrid中显示时,则是按UTF-8的编码显示,所以出现乱码。那么解决方法就是:写入时按UTF-8编码写入,如:

C/C++ code
void __fastcall TForm1::Button3Click(TObject *Sender)
{
char * errmsg;
……
[/Quote]
我查了下资料:当我不进行转码时,往sqlit表中插入中文字段"严",然后用utrledit打开,发现其编码是:D1 CF:这是“严”的ANS编码,进行转码后,编码改为了:E4 B8 89:这是“严”的UTF8编码
我分析里下:是不是如果不转码的话,sqlite中存储的编码是D1 CF,当读取时也是读取这个编码,但是 不是用ANS码,而是用UTF8编码,可D1 CF用UTF8来解释,结果就是不可知的,从而造成乱码,是不是这个原因啊?
xianyz2012 2012-10-18
  • 打赏
  • 举报
回复
[Quote=引用 19 楼 的回复:]

引用 18 楼 的回复:

我来了,楼主还在么?

经研究发现,问题的主要原因是你写入数据的时候,字符的编码是ANSI的,而在DBGrid中显示时,则是按UTF-8的编码显示,所以出现乱码。那么解决方法就是:写入时按UTF-8编码写入,如:

C/C++ code
void __fastcall TForm1::Button3Click(TObject *Sender)
{
……
[/Quote]
不太明白转码是特别针对sqlite数据库还是其他原因,麻烦妖哥开导下...
xianyz2012 2012-10-18
  • 打赏
  • 举报
回复
[Quote=引用 18 楼 的回复:]

我来了,楼主还在么?

经研究发现,问题的主要原因是你写入数据的时候,字符的编码是ANSI的,而在DBGrid中显示时,则是按UTF-8的编码显示,所以出现乱码。那么解决方法就是:写入时按UTF-8编码写入,如:

C/C++ code
void __fastcall TForm1::Button3Click(TObject *Sender)
{
char * errmsg;
……
[/Quote]
谢谢妖哥 能正确显示

有点疑问:DBgrid是按照 UTF8的编码显示,所以在插入sqlite数据库之前需要将ANSI转码为UTF8,但以前我没用SQLITE数据库时,用DBGrid关联表时,也没有转码啊,怎么会也能正确显示啊。
xianyz2012 2012-10-17
  • 打赏
  • 举报
回复
[Quote=引用 6 楼 的回复:]

引用 5 楼 的回复:
怎么转啊。用文本打开另存为:选中utf8格式么


别这样,数据库会被损坏的。

读出其中的记录,转换后再存回。
[/Quote]
妖哥:我新建了一个数据库,新加了一张表,新增了一条记录,DBGrid显示出来还是乱码,是不是代码有什么问题啊:代码如下:
//创建库
void __fastcall TForm10::BitBtn1Click(TObject *Sender)
{
char *dbname = "d:\\tannj_test_db.db";
int errcode = sqlite3_open(dbname, &PDB);
if(errcode)
{
Label1->Caption = "创建SQLite数据库失败";
}
else
{
Label1->Caption = "创建SQLite数据库成功";
}

}
//------------------------------------------------------------------------//创建表
void __fastcall TForm10::Button1Click(TObject *Sender)
{
char * errmsg;
char * sql = "create table tannj_table4(id integer, name varchar(100))";
int result = sqlite3_exec(PDB, sql, 0,0, &errmsg);
if (result) {
Label1->Caption = "创建表失败";
}
else
{
Label1->Caption = "创建表成功";
}
}
//------------------------------------------------------------------------
//添加记录
void __fastcall TForm10::Button2Click(TObject *Sender)
{
char * errmsg;
char * sql = "insert into tannj_table4(id, name) values(1, '张三')";
int result = sqlite3_exec(PDB, sql, 0,0, &errmsg);
if (result) {
Label1->Caption = "插入数据失败";
}
else
{
Label1->Caption = "插入数据成功";
}
}
//
laowang2 2012-10-17
  • 打赏
  • 举报
回复
CB6的有问题,建议2007以上。
ccrun.com 2012-10-17
  • 打赏
  • 举报
回复
[Quote=引用 5 楼 的回复:]
怎么转啊。用文本打开另存为:选中utf8格式么
[/Quote]

别这样,数据库会被损坏的。

读出其中的记录,转换后再存回。
xianyz2012 2012-10-17
  • 打赏
  • 举报
回复
[Quote=引用 4 楼 的回复:]

sqlite expert打开就显示乱码,说明你sqlite里面压根没有存成utf8的。 sqlite里面的字符串最好存成utf8或者utf16.估计你存成gbk了。。自己将gbk转成utf8吧。。。
[/Quote]
怎么转啊。用文本打开另存为:选中utf8格式么
ccrun.com 2012-10-17
  • 打赏
  • 举报
回复
我来了,楼主还在么?

经研究发现,问题的主要原因是你写入数据的时候,字符的编码是ANSI的,而在DBGrid中显示时,则是按UTF-8的编码显示,所以出现乱码。那么解决方法就是:写入时按UTF-8编码写入,如:

void __fastcall TForm1::Button3Click(TObject *Sender)
{
char * errmsg;

AnsiString strSQL = AnsiString().sprintf(
"insert into t1(id, name) values(1, '%s')",
AnsiToUtf8("张三"));

int result = sqlite3_exec(PDB, strSQL.c_str(), 0,0, &errmsg);
if (result)
{
Label1->Caption = "插入数据失败";
}
else
{
Label1->Caption = "插入数据成功";
}
}
xianyz2012 2012-10-17
  • 打赏
  • 举报
回复
[Quote=引用 16 楼 的回复:]

引用 15 楼 的回复:
我用的是xe3


早说啊老弟,我还一直用CB6帮你测试呢。我去研究一下先。
[/Quote]
....
我错了 妖哥...
ccrun.com 2012-10-17
  • 打赏
  • 举报
回复
[Quote=引用 15 楼 的回复:]
我用的是xe3
[/Quote]

早说啊老弟,我还一直用CB6帮你测试呢。我去研究一下先。
xianyz2012 2012-10-17
  • 打赏
  • 举报
回复
[Quote=引用 14 楼 的回复:]

你这个sqlite驱动哪里来的?
[/Quote]
我用的是xe3
ccrun.com 2012-10-17
  • 打赏
  • 举报
回复
你这个sqlite驱动哪里来的?
xianyz2012 2012-10-17
  • 打赏
  • 举报
回复
[Quote=引用 11 楼 的回复:]

将数据显示在DBGrid中的代码呢?
[/Quote]
显示在DBGrid是通过以下几个控件实现的:
SQLConnection1:设置driver为sqlite,设置parmas:sqlite,d:\tannj_test_db.db
SQLTable1 :连上SQLConnection1,设置tablename
DataSetProvider1:dataset设为:SQLTable1;
ClientDataSet1:的Provider设为:DataSetProvider1
DataSource1:Dataset设为:ClientDataSet1
DBgrid1:datasour设为:DataSource1;
xianyz2012 2012-10-17
  • 打赏
  • 举报
回复
显示在DBGrid是通过以下几个控件实现的:
SQLConnection1:设置driver为sqlite,设置parmas:sqlite,d:\tannj_test_db.db
SQLTable1 :连上SQLConnection1,设置tablename
DataSetProvider1:dataset设为:SQLTable1;
ClientDataSet1:的Provider设为:DataSetProvider1
DataSource1:Dataset设为:ClientDataSet1
DBgrid1:datasour设为:DataSource1;

ccrun.com 2012-10-17
  • 打赏
  • 举报
回复
将数据显示在DBGrid中的代码呢?
xianyz2012 2012-10-17
  • 打赏
  • 举报
回复
[Quote=引用 9 楼 的回复:]

创建数据库的时候指定的编码是什么?
[/Quote]
用sqlite3_open()方式创建数据库的话是utf8
用sqlite3_open16()方式创建数据库的话是UTF16
ccrun.com 2012-10-17
  • 打赏
  • 举报
回复
创建数据库的时候指定的编码是什么?
coolspac 2012-10-16
  • 打赏
  • 举报
回复
sqlite expert打开就显示乱码,说明你sqlite里面压根没有存成utf8的。 sqlite里面的字符串最好存成utf8或者utf16.估计你存成gbk了。。自己将gbk转成utf8吧。。。
加载更多回复(3)

604

社区成员

发帖
与我相关
我的任务
社区描述
C++ Builder VCL组件使用和开发
社区管理员
  • VCL组件使用和开发社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧