23 个解决方案
#1
转换成WideString看看
#2
怎么转啊...妖哥...
还有问题的补充描述:现在的数据库db文件是以前建立的,用sqlite expert打开显示时中文字段就是乱码了。
#3
你现在得搞清楚这个DB文件中存储的数据是什么编码。
#4
sqlite expert打开就显示乱码,说明你sqlite里面压根没有存成utf8的。 sqlite里面的字符串最好存成utf8或者utf16.估计你存成gbk了。。自己将gbk转成utf8吧。。。
#5
怎么转啊。用文本打开另存为:选中utf8格式么
#6
别这样,数据库会被损坏的。
读出其中的记录,转换后再存回。
#7
CB6的有问题,建议2007以上。
#8
妖哥:我新建了一个数据库,新加了一张表,新增了一条记录,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
用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;
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
显示在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
我用的是xe3
#16
早说啊老弟,我还一直用CB6帮你测试呢。我去研究一下先。
#17
....
我错了 妖哥...
#18
我来了,楼主还在么?
经研究发现,问题的主要原因是你写入数据的时候,字符的编码是ANSI的,而在DBGrid中显示时,则是按UTF-8的编码显示,所以出现乱码。那么解决方法就是:写入时按UTF-8编码写入,如:
经研究发现,问题的主要原因是你写入数据的时候,字符的编码是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
谢谢妖哥 能正确显示
有点疑问:DBgrid是按照 UTF8的编码显示,所以在插入sqlite数据库之前需要将ANSI转码为UTF8,但以前我没用SQLITE数据库时,用DBGrid关联表时,也没有转码啊,怎么会也能正确显示啊。
#20
不太明白转码是特别针对sqlite数据库还是其他原因,麻烦妖哥开导下...
#21
我查了下资料:当我不进行转码时,往sqlit表中插入中文字段"严",然后用utrledit打开,发现其编码是:D1 CF:这是“严”的ANS编码,进行转码后,编码改为了:E4 B8 89:这是“严”的UTF8编码
我分析里下:是不是如果不转码的话,sqlite中存储的编码是D1 CF,当读取时也是读取这个编码,但是 不是用ANS码,而是用UTF8编码,可D1 CF用UTF8来解释,结果就是不可知的,从而造成乱码,是不是这个原因啊?
#22
是的,就是这个样子。
#23
嗯 谢谢妖哥 收获很大...嘿嘿
#1
转换成WideString看看
#2
怎么转啊...妖哥...
还有问题的补充描述:现在的数据库db文件是以前建立的,用sqlite expert打开显示时中文字段就是乱码了。
#3
你现在得搞清楚这个DB文件中存储的数据是什么编码。
#4
sqlite expert打开就显示乱码,说明你sqlite里面压根没有存成utf8的。 sqlite里面的字符串最好存成utf8或者utf16.估计你存成gbk了。。自己将gbk转成utf8吧。。。
#5
怎么转啊。用文本打开另存为:选中utf8格式么
#6
别这样,数据库会被损坏的。
读出其中的记录,转换后再存回。
#7
CB6的有问题,建议2007以上。
#8
妖哥:我新建了一个数据库,新加了一张表,新增了一条记录,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
用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;
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
显示在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
我用的是xe3
#16
早说啊老弟,我还一直用CB6帮你测试呢。我去研究一下先。
#17
....
我错了 妖哥...
#18
我来了,楼主还在么?
经研究发现,问题的主要原因是你写入数据的时候,字符的编码是ANSI的,而在DBGrid中显示时,则是按UTF-8的编码显示,所以出现乱码。那么解决方法就是:写入时按UTF-8编码写入,如:
经研究发现,问题的主要原因是你写入数据的时候,字符的编码是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
谢谢妖哥 能正确显示
有点疑问:DBgrid是按照 UTF8的编码显示,所以在插入sqlite数据库之前需要将ANSI转码为UTF8,但以前我没用SQLITE数据库时,用DBGrid关联表时,也没有转码啊,怎么会也能正确显示啊。
#20
不太明白转码是特别针对sqlite数据库还是其他原因,麻烦妖哥开导下...
#21
我查了下资料:当我不进行转码时,往sqlit表中插入中文字段"严",然后用utrledit打开,发现其编码是:D1 CF:这是“严”的ANS编码,进行转码后,编码改为了:E4 B8 89:这是“严”的UTF8编码
我分析里下:是不是如果不转码的话,sqlite中存储的编码是D1 CF,当读取时也是读取这个编码,但是 不是用ANS码,而是用UTF8编码,可D1 CF用UTF8来解释,结果就是不可知的,从而造成乱码,是不是这个原因啊?
#22
是的,就是这个样子。
#23
嗯 谢谢妖哥 收获很大...嘿嘿