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

时间:2021-11-02 06:36:15
如题:用ClientDataSet关联上sqlite3的一张表,表中有中文字段,但是当用DBGrid显示出来时,中文乱码,该怎么解决

23 个解决方案

#1


转换成WideString看看

#2


引用 1 楼  的回复:
转换成WideString看看

怎么转啊...妖哥...
还有问题的补充描述:现在的数据库db文件是以前建立的,用sqlite expert打开显示时中文字段就是乱码了。

#3


你现在得搞清楚这个DB文件中存储的数据是什么编码。

#4


sqlite expert打开就显示乱码,说明你sqlite里面压根没有存成utf8的。 sqlite里面的字符串最好存成utf8或者utf16.估计你存成gbk了。。自己将gbk转成utf8吧。。。

#5


引用 4 楼  的回复:
sqlite expert打开就显示乱码,说明你sqlite里面压根没有存成utf8的。 sqlite里面的字符串最好存成utf8或者utf16.估计你存成gbk了。。自己将gbk转成utf8吧。。。

怎么转啊。用文本打开另存为:选中utf8格式么

#6


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


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

读出其中的记录,转换后再存回。

#7


CB6的有问题,建议2007以上。

#8


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


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

读出其中的记录,转换后再存回。

妖哥:我新建了一个数据库,新加了一张表,新增了一条记录,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 = "插入数据成功";
 }
}
//

#9


创建数据库的时候指定的编码是什么?

#10


引用 9 楼  的回复:
创建数据库的时候指定的编码是什么?

用sqlite3_open()方式创建数据库的话是utf8
用sqlite3_open16()方式创建数据库的话是UTF16

#11


将数据显示在DBGrid中的代码呢?

#12


显示在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;

#13


引用 11 楼  的回复:
将数据显示在DBGrid中的代码呢?

显示在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;

#14


你这个sqlite驱动哪里来的?

#15


引用 14 楼  的回复:
你这个sqlite驱动哪里来的?

我用的是xe3

#16


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


早说啊老弟,我还一直用CB6帮你测试呢。我去研究一下先。

#17


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


早说啊老弟,我还一直用CB6帮你测试呢。我去研究一下先。

....
我错了  妖哥...

#18


我来了,楼主还在么?

经研究发现,问题的主要原因是你写入数据的时候,字符的编码是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 = "插入数据成功";
}
}

#19


引用 18 楼  的回复:
我来了,楼主还在么?

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

C/C++ code
void __fastcall TForm1::Button3Click(TObject *Sender)
{
    char * errmsg;
……

谢谢妖哥  能正确显示  

有点疑问:DBgrid是按照 UTF8的编码显示,所以在插入sqlite数据库之前需要将ANSI转码为UTF8,但以前我没用SQLITE数据库时,用DBGrid关联表时,也没有转码啊,怎么会也能正确显示啊。

#20


引用 19 楼  的回复:
引用 18 楼  的回复:

我来了,楼主还在么?

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

C/C++ code
void __fastcall TForm1::Button3Click(TObject *Sender)
{
……

不太明白转码是特别针对sqlite数据库还是其他原因,麻烦妖哥开导下...

#21


引用 18 楼  的回复:
我来了,楼主还在么?

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

C/C++ code
void __fastcall TForm1::Button3Click(TObject *Sender)
{
    char * errmsg;
……

我查了下资料:当我不进行转码时,往sqlit表中插入中文字段"严",然后用utrledit打开,发现其编码是:D1 CF:这是“严”的ANS编码,进行转码后,编码改为了:E4 B8 89:这是“严”的UTF8编码
我分析里下:是不是如果不转码的话,sqlite中存储的编码是D1 CF,当读取时也是读取这个编码,但是 不是用ANS码,而是用UTF8编码,可D1 CF用UTF8来解释,结果就是不可知的,从而造成乱码,是不是这个原因啊?

#22


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


是的,就是这个样子。

#23


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

是的,就是这个样子。

嗯 谢谢妖哥  收获很大...嘿嘿

#1


转换成WideString看看

#2


引用 1 楼  的回复:
转换成WideString看看

怎么转啊...妖哥...
还有问题的补充描述:现在的数据库db文件是以前建立的,用sqlite expert打开显示时中文字段就是乱码了。

#3


你现在得搞清楚这个DB文件中存储的数据是什么编码。

#4


sqlite expert打开就显示乱码,说明你sqlite里面压根没有存成utf8的。 sqlite里面的字符串最好存成utf8或者utf16.估计你存成gbk了。。自己将gbk转成utf8吧。。。

#5


引用 4 楼  的回复:
sqlite expert打开就显示乱码,说明你sqlite里面压根没有存成utf8的。 sqlite里面的字符串最好存成utf8或者utf16.估计你存成gbk了。。自己将gbk转成utf8吧。。。

怎么转啊。用文本打开另存为:选中utf8格式么

#6


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


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

读出其中的记录,转换后再存回。

#7


CB6的有问题,建议2007以上。

#8


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


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

读出其中的记录,转换后再存回。

妖哥:我新建了一个数据库,新加了一张表,新增了一条记录,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 = "插入数据成功";
 }
}
//

#9


创建数据库的时候指定的编码是什么?

#10


引用 9 楼  的回复:
创建数据库的时候指定的编码是什么?

用sqlite3_open()方式创建数据库的话是utf8
用sqlite3_open16()方式创建数据库的话是UTF16

#11


将数据显示在DBGrid中的代码呢?

#12


显示在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;

#13


引用 11 楼  的回复:
将数据显示在DBGrid中的代码呢?

显示在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;

#14


你这个sqlite驱动哪里来的?

#15


引用 14 楼  的回复:
你这个sqlite驱动哪里来的?

我用的是xe3

#16


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


早说啊老弟,我还一直用CB6帮你测试呢。我去研究一下先。

#17


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


早说啊老弟,我还一直用CB6帮你测试呢。我去研究一下先。

....
我错了  妖哥...

#18


我来了,楼主还在么?

经研究发现,问题的主要原因是你写入数据的时候,字符的编码是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 = "插入数据成功";
}
}

#19


引用 18 楼  的回复:
我来了,楼主还在么?

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

C/C++ code
void __fastcall TForm1::Button3Click(TObject *Sender)
{
    char * errmsg;
……

谢谢妖哥  能正确显示  

有点疑问:DBgrid是按照 UTF8的编码显示,所以在插入sqlite数据库之前需要将ANSI转码为UTF8,但以前我没用SQLITE数据库时,用DBGrid关联表时,也没有转码啊,怎么会也能正确显示啊。

#20


引用 19 楼  的回复:
引用 18 楼  的回复:

我来了,楼主还在么?

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

C/C++ code
void __fastcall TForm1::Button3Click(TObject *Sender)
{
……

不太明白转码是特别针对sqlite数据库还是其他原因,麻烦妖哥开导下...

#21


引用 18 楼  的回复:
我来了,楼主还在么?

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

C/C++ code
void __fastcall TForm1::Button3Click(TObject *Sender)
{
    char * errmsg;
……

我查了下资料:当我不进行转码时,往sqlit表中插入中文字段"严",然后用utrledit打开,发现其编码是:D1 CF:这是“严”的ANS编码,进行转码后,编码改为了:E4 B8 89:这是“严”的UTF8编码
我分析里下:是不是如果不转码的话,sqlite中存储的编码是D1 CF,当读取时也是读取这个编码,但是 不是用ANS码,而是用UTF8编码,可D1 CF用UTF8来解释,结果就是不可知的,从而造成乱码,是不是这个原因啊?

#22


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


是的,就是这个样子。

#23


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

是的,就是这个样子。

嗯 谢谢妖哥  收获很大...嘿嘿